【本文谢绝转载】
<大纲>
基本概念
vector数组基本数据类型操作
vector数组复杂数据类型操作
vector数组指针数据类型操作
string
字符串的初始化:
string的 遍历之 for
string的 遍历之迭代器
string的 遍历 之 at()
string的 遍历 []
string的 遍历 [] 与 at()对比
string指针与string转换 : s1===>char *
string指针与string转换 : char *====>sting
string指针与string转换 : s1的内容copy buf中
string字符串的连接
string字符串的查找 find()返回第一次出现的位置
string查找字符串出现的次数:
string字符替换:replace()
string字符串的查找并替换
string单个字符的删除
string删除整个字符串
string字符串的头插法,尾插法
string字符串大小写转换
容器
vector容器
vector容器元素数量,尾部插入,头部元素,尾部元素,尾部元素删除
vector容器的初始化:
vector的遍历 通过数组的方式
vectorpush_back强化训练
vector区间删除:
vector删除指定位置的元素:
vector根据元素的值,删除元素
vector在首部,尾部插入元素:
迭代器,正向反向
deque双端数组容器:尾插,头插,遍历,首部弹出,尾部弹出
deque双端数组容器:查找元素所在容器的位置
stack容器:入栈,出栈,栈顶,栈大小
stack装入类
stack装入指针
queue队列:基本元素 push() front() size() pop()
queue队列:复杂类型
queue队列:指针类型
list的基本操作,元素的插入,遍历,不支持随机访问
list的删除,移除,
priority_queue优先级队列
set
set的基本操作insert,迭代器,erase
set的基本操作2:插入,遍历,删除
set对基本数据类型,能自动排序:
set2 集合从大到小
set复杂数据类型
自定义数据类型,仿函数排序法
如何判断 set1.insert函数的返回值
find查找 equal_range,返回结果是一个pair
set集合的查找:
multiset基本操练:
===================================================================
容器的基本数据操作
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <algorithm>
int main()
{
vector<int> v1; //容器,把元素拷贝到容器
v1.push_back(999);
v1.push_back(1);
v1.push_back(-55654);
v1.push_back(999);
//迭代器,相当于一个指针
for(vector<int>::iterator i = v1.begin();i != v1.end();i++)
{
cout << *i << " ";
}
cout << endl;
//算法结合迭代器,找出从 v1.begin()到v1.end()有多少个999
int n = count(v1.begin(),v1.end(),999);
cout << n << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
999 1 -55654 999
2
chunli@http://990487026.blog.51cto.com~/c++$
容器里面装复杂数据类型
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <algorithm>
class Teacher
{
public:
int age;
char name[64];
void printf()
{
cout << "age="<< age<<" name=" << name<<endl;
}
};
int main()
{
Teacher t1; t1.age = 11;
Teacher t2; t2.age = 12;
Teacher t3; t3.age = 13;
Teacher t4; t4.age = 14;
vector<Teacher> v1; //容器,把元素拷贝到容器
v1.push_back(t1);
v1.push_back(t2);
v1.push_back(t3);
v1.push_back(t4);
//迭代器,相当于一个指针
for(vector<Teacher>::iterator i = v1.begin();i != v1.end();i++)
{
cout << i->age << " ";
//cout << (*i).age << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
11 12 13 14
chunli@http://990487026.blog.51cto.com~/c++$
把指针装入容器
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <algorithm>
class Teacher
{
public:
int age;
char name[64];
void printf()
{
cout << "age="<< age<<" name=" << name<<endl;
}
};
int main()
{
Teacher t1; t1.age = 11;
Teacher t2; t2.age = 12;
Teacher t3; t3.age = 13;
Teacher t4; t4.age = 14;
Teacher *p1 = &t1;
Teacher *p2 = &t2;
Teacher *p3 = &t3;
Teacher *p4 = &t4;
vector<Teacher*> v1; //容器,把地址拷贝到容器
v1.push_back(p1);
v1.push_back(p2);
v1.push_back(p3);
v1.push_back(p4);
//迭代器,相当于一个指针
for(vector<Teacher*>::iterator i = v1.begin();i != v1.end();i++)
{
cout << (*i)->age << " ";
//cout << (*i).age << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
11 12 13 14
chunli@http://990487026.blog.51cto.com~/c++$
STL Srring
1 字符串的初始化:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "aaaa";
string s2("bbbb");
string s3 = s2; //通过拷贝构造函数 来初始化对象s3
string s4(10, 'a');
cout << "s1=" << s1 << endl;
cout << "s2=" << s2 << endl;
cout << "s3=" << s3 << endl;
cout << "s4=" << s4 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
s1=aaaa
s2=bbbb
s3=bbbb
s4=aaaaaaaaaa
chunli@http://990487026.blog.51cto.com~/c++$
================================================
string的 遍历1 []
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "abcdefg";
//1 数组方式
for (int i=0; i<s1.length(); i++)
{
cout << s1[i] << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
a b c d e f g
chunli@http://990487026.blog.51cto.com~/c++$
string的 遍历2 迭代器
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "abcdefg";
//2 迭代器
for (string::iterator it = s1.begin(); it != s1.end(); it++ )
{
cout << *it << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
a b c d e f g
chunli@http://990487026.blog.51cto.com~/c++$
string的 遍历2 at(),可以捕获异常
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "abcdefg";
try
{
for (int i=0; i<s1.length() + 3; i++)
{
cout << s1.at(i) << " "; //抛出异常
}
}
catch ( ... )
{
cout << "发生异常\n" ;
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
a b c d e f g 发生异常
chunli@http://990487026.blog.51cto.com~/c++$
string的 遍历 [] 与 at()对比,[]不会捕获异常,VS环境下程序会中断,GCC下就不会
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "abcdefg";
try
{
for (int i=0; i<s1.length() + 3; i++)
{
cout << s1[i] << " "; //出现错误 不向外面抛出异常 引起程序的中断
}
cout << endl;
}
catch ( ... )
{
cout << "发生异常\n" ;
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
a b c d e f g
chunli@http://990487026.blog.51cto.com~/c++$
GDB调试。程序是正常退出的
[Inferior 1 (process 1605) exited normally]
(gdb) quit
2 字符串,指针与string转换 : s1===>char *
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "aaabbbb";
//1 s1===>char *
const char *p = s1.c_str() ;
cout << p << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
aaabbbb
chunli@http://990487026.blog.51cto.com~/c++$
2 字符串,指针与string转换 : char *====>sting
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "aaabbbb";
//1 s1===>char *
const char *p = s1.c_str() ;
//2 char *====>sting
string s2 = p;
cout << s2 << endl;;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
aaabbbb
chunli@http://990487026.blog.51cto.com~/c++$
2 字符串,指针与string转换 : s1的内容 copy buf中
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "aaabbbb";
//3 s1的内容 copy buf中
char buf1[128] = {0};
s1.copy(buf1, 3, 0); //注意 只给你copy3个字符 不会变成C风格的字符串
cout << buf1 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
aaa
chunli@http://990487026.blog.51cto.com~/c++$
3 string 字符串的连接
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "aaa";
string s2 = "bbb";
s1 = s1 + s2;
cout << s1 << endl;
string s3 = "333";
string s4 = "444";
s3.append(s4);
cout << s3 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
aaabbb
333444
chunli@http://990487026.blog.51cto.com~/c++$
4 string 字符串的查找 find()返回第一次出现的位置
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = "linux hello linux 111 linux 222 linux 333 ";
int index = s1.find("hello", 0); //位置下标 从0开始
cout << "index: " << index << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
index: 6
chunli@http://990487026.blog.51cto.com~/c++$
4 查找字符串出现的次数:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s1 = " linux hello linux 111 linux 222 linux 333 ";
int offindex = s1.find("linux", 0);
while (offindex != string::npos)
//这里的string::npos就是一个长度参数,表示直到字符串的结束
{
cout << "位置在 " << offindex << endl;
offindex = offindex + 1;
offindex = s1.find("linux", offindex); //wang bao ming
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
位置在 1
位置在 13
位置在 24
位置在 35
chunli@http://990487026.blog.51cto.com~/c++$
4 string 字符替换:replace()
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <algorithm>
int main()
{
string s3 = "aaa bbb ccc";
s3.replace(0, 3, "AAA");
cout << s3 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
AAA bbb ccc
chunli@http://990487026.blog.51cto.com~/c++$
4 string 字符串的查找并替换:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
int main()
{
string s1 = " linux hello linux 111 linux 222 linux 333 ";
int offindex = s1.find("linux", 0);
while (offindex != string::npos)
{
cout << "位置" << offindex << endl; //显示字符串找到的位置
s1.replace(offindex,strlen("linux"), "China_linux"); //替换成你想要的字符串
offindex = offindex + strlen("China_linux"); //位置偏移量,
offindex = s1.find("linux", offindex); //继续找
}
cout << "s1替换后的结果: " << s1 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
位置1
位置19
位置36
位置53
s1替换后的结果: China_linux hello China_linux 111 China_linux 222 China_linux 333
chunli@http://990487026.blog.51cto.com~/c++$
string 单个字符的删除
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
int main()
{
string s1 = "hello1 hello2 hello1";
string::iterator it = find(s1.begin(), s1.end(), 'e');
if (it != s1.end() )
{
s1.erase(it);
}
cout<< s1 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
hllo1 hello2 hello1
chunli@http://990487026.blog.51cto.com~/c++$
4 string 删除整个字符串
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
int main()
{
string s1 = "hello1 hello2 hello1";
s1.erase(s1.begin(), s1.end() );
cout << "s1全部删除:" << s1 << endl;
cout << "s1长度 " << s1.length() << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
s1全部删除:
s1长度 0
chunli@http://990487026.blog.51cto.com~/c++$
4 string 字符串的头插法,尾插法
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <vector>
#include <string>
#include <string.h>
#include <algorithm>
int main()
{
string s2 = "BBB";
s2.insert(0, "AAA "); //头插法
s2.insert(s2.length(), " CCC"); //尾插法
cout << s2 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
AAA BBB CCC
chunli@http://990487026.blog.51cto.com~/c++$
5 string字符串大小写转换
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
//STL
#include <string>
#include <algorithm>
int main()
{
string s1 = "AAAbbb";
//1字符串开始,2字符串结束,3放到那里去,4 怎么放
transform(s1.begin(), s1.end(),s1.begin(),::toupper);
cout << s1 << endl;
transform(s1.begin(), s1.end(), s1.begin(),::tolower);
cout << s1 << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
AAABBB
aaabbb
chunli@http://990487026.blog.51cto.com~/c++$
容器
vector容器:
容器元素数量,尾部插入,头部元素,尾部元素,尾部元素删除
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
int main()
{
vector<int> v1;
cout << "length:" << v1.size() <<endl; //显示容器里面的数目
v1.push_back(1); //在尾部插入int元素 1
v1.push_back(3);
v1.push_back(5);
cout << "length:" << v1.size() <<endl;
cout << "头部元素是" << v1.front() << endl;//front()是头部元素
v1.front() = 11; //修改 头部元素 函数返回值当左值 应该返回一个引用
v1.back() = 99; //修改 尾部元素 函数返回值当左值 应该返回一个引用
while (v1.size() > 0) //遍历容器
{
cout <<"尾部元素是" << v1.back() << endl; ; //获取尾部元素
v1.pop_back(); //删除尾部元素
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
length:0
length:3
头部元素是1
尾部元素是99
尾部元素是3
尾部元素是11
chunli@http://990487026.blog.51cto.com~/c++$
vector容器的初始化:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
void printV(vector<int> &v)
{
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
v1.push_back(7);
vector<int> v2 = v1; //对象初始化
vector<int> v3(v1.begin()+1, v1.begin()+3 ); //初始化来自地址
printV(v3);
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
3 5
chunli@http://990487026.blog.51cto.com~/c++$
vector的遍历 通过数组的方式
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
int main()
{
vector<int> v1(10); //提前把10个内存空间准备好
for (int i=0; i<10; i++)
{
v1[i] = i * i;
}
for (int i=0; i<10; i++)
{
cout << v1[i] << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
0 1 4 9 16 25 36 49 64 81
chunli@http://990487026.blog.51cto.com~/c++$
vector push_back强化训练
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
void printV(vector<int> &v)
{
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1(10); //提前把内存准备好
v1.push_back(100);
v1.push_back(200);
cout << "size: " << v1.size() << endl;
printV(v1);
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
size: 12
0 0 0 0 0 0 0 0 0 0 100 200
chunli@http://990487026.blog.51cto.com~/c++$
迭代器,正向 反向
//1迭代器 end()的理解
// 1 3 5
// ▲
// ▲
//当 it == v1.end()的时候 说明这个容器已经遍历完毕了...
//end()的位置 应该是 5的后面
//2 迭代器的种类
/*
typedef iterator pointer;
typedef const_iterator const_pointer;
typedef _STD reverse_iterator<iterator> reverse_iterator;
typedef _STD reverse_iterator<const_iterator> const_reverse_iterator;
*/
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
int main()
{
vector<int> v1(10);
for (int i=0; i<10; i++)
{
v1[i] = i + 1;
}
//正向遍历
for (vector<int>::iterator it = v1.begin(); it != v1.end(); it ++ )
{
cout << *it << " ";
}
cout << endl;
//逆序遍历
for (vector<int>::reverse_iterator rit = v1.rbegin(); rit!=v1.rend(); rit++ )
{
cout << *rit << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
chunli@http://990487026.blog.51cto.com~/c++$
vector区间删除:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
void printV(vector<int> &v)
{
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1(10);
for (int i=0; i<10; i++)
{
v1[i] = i + 1;
}
printV(v1);
v1.erase(v1.begin(), v1.begin()+3); //区间删除
printV(v1);
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1 2 3 4 5 6 7 8 9 10
4 5 6 7 8 9 10
chunli@http://990487026.blog.51cto.com~/c++$
chunli@http://990487026.blog.51cto.com~/c++$
vector 删除指定位置的元素:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
void printV(vector<int> &v)
{
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1(10);
for (int i=0; i<10; i++)
{
v1[i] = i + 1;
}
printV(v1);
//根据元素的位置 指定位置删除
v1.erase(v1.begin()); //在头部删除一个元素
printV(v1);
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10
chunli@http://990487026.blog.51cto.com~/c++$
vector 根据元素的值,删除元素
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
void printV(vector<int> &v)
{
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1(10);
for (int i=0; i<10; i++)
{
v1[i] = i + 1;
}
//根据元素的值
v1[1] = 2;
v1[3] = 2;
printV(v1);
for (vector<int>::iterator it =v1.begin(); it != v1.end();)
{
if (*it == 2)
{
it = v1.erase(it); //当 删除迭代器所指向的元素的时候,erase删除函数会让it自动下移动
}
else
{
it ++;
}
}
printV(v1);
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1 2 3 2 5 6 7 8 9 10
1 3 5 6 7 8 9 10
chunli@http://990487026.blog.51cto.com~/c++$
vector 在首部,尾部插入元素:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <vector>
void printV(vector<int> &v)
{
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}
int main()
{
vector<int> v1(10);
v1.insert(v1.begin(), 100);
v1.insert(v1.end(), 200);
printV(v1);
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
100 0 0 0 0 0 0 0 0 0 0 200
chunli@http://990487026.blog.51cto.com~/c++$
deque 双端数组容器:尾插,头插,遍历,首部弹出,尾部弹出
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <deque>
void printD(deque<int> &d)
{
for (deque<int>::iterator it=d.begin(); it!=d.end(); it++ )
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int> d1;
d1.push_back(1);
d1.push_back(3);
d1.push_back(5);
d1.push_front(-11);
d1.push_front(-33);
d1.push_front(-55);
printD(d1);
cout << "头部元素:" << d1.front() <<endl;
cout << "尾部元素:" << d1.back() << endl;
d1.pop_front();
d1.pop_back();
printD(d1);
cout <<endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
-55 -33 -11 1 3 5
头部元素:-55
尾部元素:5
-33 -11 1 3
chunli@http://990487026.blog.51cto.com~/c++$
deque 双端数组容器:查找元素所在容器的位置
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <deque>
#include <algorithm>
void printD(deque<int> &d)
{
for (deque<int>::iterator it=d.begin(); it!=d.end(); it++ )
{
cout << *it << " ";
}
cout << endl;
}
int main()
{
deque<int> d1;
d1.push_back(1);
d1.push_back(3);
d1.push_back(5);
d1.push_front(-11);
d1.push_front(-33);
d1.push_front(-55);
printD(d1);
//查找 -33 在数组下标的值
deque<int>::iterator it = find(d1.begin(), d1.end(), -33 );
if (it != d1.end())
{
cout << "-33数组下标是" << distance(d1.begin(), it) <<endl;
}
else
{
cout << "没有找到值为-33的元素" << endl;
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
-55 -33 -11 1 3 5
-33数组下标是1
chunli@http://990487026.blog.51cto.com~/c++$
stack容器:入栈,出栈,栈顶,栈大小
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
栈的大小是 10
81 64 49 36 25 16 9 4 1 0
栈的大小是 0
chunli@http://990487026.blog.51cto.com~/c++$
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <stack>
int main()
{
stack<int> s;
//入栈
for (int i=0; i<10; i++)
{
s.push(i * i); //把元素压入 stack容器
}
cout << "栈的大小是 " << s.size() << endl;
//出栈
while (!s.empty())
{
int tmp = s.top(); //获取栈顶元素
cout << tmp << " ";
s.pop(); //弹出栈顶元素
}
cout << endl;
cout << "栈的大小是 " << s.size() << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
栈的大小是 10
81 64 49 36 25 16 9 4 1 0
栈的大小是 0
chunli@http://990487026.blog.51cto.com~/c++$
stack装入复杂数据
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <stack>
class Teacher
{
public:
int age;
char name[32];
public:
void printT()
{
cout << "age:" << age << endl;
}
};
int main()
{
Teacher t1, t2, t3;
t1.age = 31;
t2.age = 32;
t3.age = 33;
stack<Teacher> s;
s.push(t1);
s.push(t2);
s.push(t3);
while (!s.empty())
{
Teacher tmp = s.top();
tmp.printT();
s.pop();
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
age:33
age:32
age:31
chunli@http://990487026.blog.51cto.com~/c++$
stack装入指针
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <stack>
class Teacher
{
public:
int age;
char name[32];
public:
void printT()
{
cout << "age:" << age << endl;
}
};
int main()
{
Teacher t1, t2, t3;
t1.age = 31;
t2.age = 32;
t3.age = 33;
stack<Teacher *> s;
s.push(&t1);
s.push(&t2);
s.push(&t3);
while ( !s.empty())
{
Teacher *p = s.top();
p->printT();
s.pop();
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
age:33
age:32
age:31
chunli@http://990487026.blog.51cto.com~/c++$
queue队列:基本元素 push() front() size() pop()
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <queue>
int main()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
cout << "队头元素:" << q.front() << endl;
cout << "队列的大小" << q.size() <<endl;
while ( !q.empty())
{
int tmp = q.front();
cout << tmp << " ";
q.pop();
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
队头元素:1
队列的大小3
1 2 3
chunli@http://990487026.blog.51cto.com~/c++$
queue队列:复杂类型
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <queue>
class Teacher
{
public:
int age;
char name[32];
public:
void printT()
{
cout << "age:" << age << endl;
}
};
int main()
{
Teacher t1, t2, t3;
t1.age = 31;
t2.age = 32;
t3.age = 33;
queue<Teacher> q;
q.push(t1);
q.push(t2);
q.push(t3);
while (!q.empty())
{
Teacher tmp = q.front();
tmp.printT();
q.pop();
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
age:31
age:32
age:33
chunli@http://990487026.blog.51cto.com~/c++$
queue队列:指针类型
chunli@http://990487026.blog.51cto.com~/c++$
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <queue>
class Teacher
{
public:
int age;
char name[32];
public:
void printT()
{
cout << "age:" << age << endl;
}
};
int main()
{
Teacher t1, t2, t3;
t1.age = 31;
t2.age = 32;
t3.age = 33;
queue<Teacher *> q;
q.push(&t1);
q.push(&t2);
q.push(&t3);
while (!q.empty())
{
Teacher *tmp = q.front();
tmp->printT();
q.pop();
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
age:31
age:32
age:33
chunli@http://990487026.blog.51cto.com~/c++$
list的基本操作,元素的插入,遍历,不支持随机访问
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <list>
int main()
{
list<int> l;
cout << "list的大小:" << l.size() << endl;
for (int i=0; i<10; i++)
{
l.push_back(i); //尾部插入元素 尾插法
}
cout << "list的大小:" << l.size() << endl;
list<int>::iterator it = l.begin();
while (it != l.end())
{
cout << *it << " ";
it ++;
}
cout << endl;
//list不能随机访问
//0 1 2 3 4 5
// ▲
it = l.begin();
it ++;
it ++ ;
it ++ ;
//it = it + 5; //不支持随机的访问容器
l.insert(it, 100); //请问100插入什么位置
for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
//结论1 链表的结点index 序号是从0号位置开始
// 在3号位置插入元素, 让原来的3号位置变成4号位置 原来的4号位置变成5号位置
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
list的大小:0
list的大小:10
0 1 2 3 4 5 6 7 8 9
0 1 2 100 3 4 5 6 7 8 9
chunli@http://990487026.blog.51cto.com~/c++$
list的删除,移除,
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <list>
int main()
{
list<int> l;
cout << "list的大小:" << l.size() << endl;
for (int i=0; i<10; i++)
{
l.push_back(i); //尾部插入元素 尾插法
}
cout << "list的大小:" << l.size() << endl;
for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
//0 1 2 3 4 5
// ▲
list<int>::iterator it1 = l.begin();
list<int>::iterator it2 = l.begin();
it2 ++ ;
it2 ++ ;
it2 ++ ;
l.erase(it1, it2);
for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
l.insert(l.begin(), 100);
l.insert(l.begin(), 100);
l.insert(l.begin(), 100);
l.erase(l.begin()); //
l.remove(100); //2
for (list<int>::iterator it=l.begin(); it!=l.end(); it++)
{
cout << *it <<" ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
list的大小:0
list的大小:10
0 1 2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
3 4 5 6 7 8 9
chunli@http://990487026.blog.51cto.com~/c++$
优先级队列 priority_queue
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
队头元素:55
队列的大小:4
55 33 22 11 测试 最小值优先级队列
最小值优先级队列 队头元素:11
最小值优先级队列 队列的大小:4
11 22 33 55
chunli@http://990487026.blog.51cto.com~/c++$
chunli@http://990487026.blog.51cto.com~/c++$
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <queue>
int main()
{
priority_queue<int> p1 ; //默认情况下 是 最大值优先级队列
priority_queue<int , vector<int>, less<int> > p2; //提前定义好的预定义函数 谓词
priority_queue<int , vector<int>, greater<int> > p3; //最小值优先级队列
p1.push(33);
p1.push(11);
p1.push(55);
p1.push(22);
cout << "队头元素:" << p1.top() <<endl;
cout << "队列的大小:" << p1.size() << endl;
while (p1.size() > 0 )
{
cout << p1.top() << " ";
p1.pop();
}
cout << "测试 最小值优先级队列 " << endl;
p3.push(33);
p3.push(11);
p3.push(55);
p3.push(22);
cout << "最小值优先级队列 队头元素:" << p3.top() <<endl;
cout << "最小值优先级队列 队列的大小:" << p3.size() << endl;
while (p3.size() > 0 )
{
cout << p3.top() << " ";
p3.pop();
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
队头元素:55
队列的大小:4
55 33 22 11 测试 最小值优先级队列
最小值优先级队列 队头元素:11
最小值优先级队列 队列的大小:4
11 22 33 55
chunli@http://990487026.blog.51cto.com~/c++$
set的基本操作insert,迭代器,erase
1 集合 有序(默认从小到大) 唯一 (红黑二叉树 这种数据结构的变体)
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
using namespace std;
#include <set>
int main()
{
set<int> set1;
for (int i=0; i<5; i++)
{
int tmp = rand();
set1.insert(tmp);
}
set1.insert(100);
set1.insert(100);
set1.insert(100);
//打印输出
for (set<int>::iterator it = set1.begin(); it != set1.end(); it++)
{
cout<< *it << " ";
}
cout << endl;
//删除集合
cout << "删除集合\n";
while (!set1.empty())
{
set<int>::iterator it = set1.begin();
cout << *it << " ";
set1.erase(set1.begin());
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
100 846930886 1681692777 1714636915 1804289383 1957747793
删除集合
100 846930886 1681692777 1714636915 1804289383 1957747793
chunli@http://990487026.blog.51cto.com~/c++$
set的基本操作2:插入,遍历,删除
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#include <set>
int main()
{
set<int> set1;
for (int i=0; i<5; i++)
{
int tmp = rand();
set1.insert(tmp);
}
//插入元素 重复的
set1.insert(100);
set1.insert(100);
set1.insert(100);
for (set<int>::iterator it=set1.begin(); it!=set1.end(); it++ )
{
cout << *it << " ";
}
cout << endl;
//删除集合
while ( !set1.empty())
{
set<int>::iterator it = set1.begin();
cout << *it << " ";
set1.erase(set1.begin());
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
100 846930886 1681692777 1714636915 1804289383 1957747793
100 846930886 1681692777 1714636915 1804289383 1957747793
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
set对基本数据类型,能自动排序:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
using namespace std;
#include <set>
int main()
{
set<int> set1;
set<int, less<int> > set2; //默认情况下是这样
set<int, greater<int> > set3; //从大 到 小
for (int i=0; i<5; i++)
{
int tmp = rand();
set3.insert(tmp);
}
//从大 到 小
for (set<int, greater<int> >::iterator it = set3.begin(); it != set3.end(); it++ )
{
cout << *it << endl;
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1957747793
1804289383
1714636915
1681692777
846930886
chunli@http://990487026.blog.51cto.com~/c++$
set 2 集合 从大到小
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#include <set>
int main()
{
set<int, greater<int> > set1;
for (int i=0; i<5; i++)
{
int tmp = rand();
set1.insert(tmp);
}
set1.insert(100);
set1.insert(100);
set1.insert(100);
//打印输出
for (set<int, greater<int> >::iterator it = set1.begin(); it != set1.end(); it++)
{
cout<< *it << " ";
}
cout << endl;
//删除集合
cout << "删除集合\n";
while (!set1.empty())
{
set<int, greater<int> >::iterator it = set1.begin();
printf("%d ", *it);
set1.erase(set1.begin());
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1957747793 1804289383 1714636915 1681692777 846930886 100
删除集合
1957747793 1804289383 1714636915 1681692777 846930886 100
chunli@http://990487026.blog.51cto.com~/c++$
set 复杂数据类型
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#include <set>
//3 自定义数据类型 排序
//03 仿函数 函数对象 重载() 操作 进行比较大小
//题目:学生包含学号,姓名属性,现要求任意插入几个学生对象到set容器中,
//使得容器中的学生按学号的升序排序
class Student
{
public:
Student(const char *name, int age)
{
strcpy(this->name, name);
this->age = age;
}
protected:
public:
char name[64];
int age ;
};
//函数对象
struct StuFunctor
{
bool operator()(const Student &left, const Student &right)
{
return (left.age < right.age);
}
};
int main()
{
set<Student, StuFunctor> set1;
Student s1("张1", 32);
set1.insert(s1);
set1.insert(Student("张2", 32) );
set1.insert(Student("张3", 53) );
set1.insert(Student("张4", 34) );
//打印输出
for (set<Student, StuFunctor >::iterator it = set1.begin(); it != set1.end(); it++)
{
cout<< (*it).name << " ";
}
cout << endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
张1 张4 张3
chunli@http://990487026.blog.51cto.com~/c++$
自定义数据类型,仿函数排序法
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include <set>
class Student
{
public:
Student(const char *name, int age)
{
strcpy(this->name, name);
this->age = age;
}
public:
char name[64];
int age;
};
//仿函数
struct FuncStudent
{
bool operator()(const Student &left, const Student &right)
{
if (left.age < right.age) //如果左边的小 就返回真 从小到大按照年龄进行排序
{
return true;
}
else
{
return false;
}
}
};
int main()
{
Student s1("s1", 31);
Student s2("s2", 22);
Student s3("s3", 44);
Student s4("s4", 11);
Student s5("s5", 31);
set<Student, FuncStudent> set1;
set1.insert(s1);
set1.insert(s2);
set1.insert(s3);
set1.insert(s4);
set1.insert(s5); //如果两个31岁 能插入成功
//如何知道 插入 的结果
//遍历
for (set<Student, FuncStudent>::iterator it=set1.begin(); it!=set1.end(); it++ )
{
cout << it->age << "\t" << it->name << endl;
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
11 s4
22 s2
31 s1
44 s3
chunli@http://990487026.blog.51cto.com~/c++$
如何判断 set1.insert函数的返回值
//typedef pair<iterator, bool> _Pairib;
//4 如何判断 set1.insert函数的返回值
//Pair的用法
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#include <set>
class Student
{
public:
Student(const char *name, int age)
{
strcpy(this->name, name);
this->age = age;
}
public:
char name[64];
int age;
};
//仿函数
struct FuncStudent
{
bool operator()(const Student &left, const Student &right)
{
if (left.age < right.age) //如果左边的小 就返回真 从小到大按照年龄进行排序
{
return true;
}
else
{
return false;
}
}
};
int main()
{
Student s1("s1", 31);
Student s2("s2", 22);
Student s3("s3", 44);
Student s4("s4", 11);
Student s5("s5", 31);
set<Student, FuncStudent> set1;
pair<set<Student, FuncStudent>::iterator, bool> pair1 = set1.insert(s1);
if (pair1.second == true)
{
cout << "插入s1成功" << endl;
}
else
{
cout << "插入s1失败" << endl;
}
set1.insert(s2);
//如何知道 插入 的结果
pair<set<Student, FuncStudent>::iterator, bool> pair5 = set1.insert(s5); //如果两个31岁 能插入成功
if (pair5.second == true)
{
cout << "插入s1成功" << endl;
}
else
{
cout << "插入s1失败" << endl;
}
//遍历
for (set<Student, FuncStudent>::iterator it=set1.begin(); it!=set1.end(); it++ )
{
cout << it->age << "\t" << it->name << endl;
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
插入s1成功
插入s1失败
22 s2
31 s1
chunli@http://990487026.blog.51cto.com~/c++$
find查找 equal_range 返回结果是一个pair
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
using namespace std;
#include <set>
int main()
{
set<int> set1;
for (int i=0; i<10; i++)
{
set1.insert(i+1);
}
//从大 到 小
for (set<int>::iterator it = set1.begin(); it != set1.end(); it++ )
{
cout << *it << " ";
}
cout << endl;
set<int>::iterator it0 = set1.find(5);
cout << "it0:" << *it0 << endl;
int num1 = set1.count(5);
cout << "num1:" << num1 << endl;
set<int>::iterator it1 = set1.lower_bound(5); // 大于等于5的元素 的 迭代器的位置
cout << "it1:" << *it1 << endl;
set<int>::iterator it2 = set1.lower_bound(5); // 大于5的元素 的 迭代器的位置
cout << "it2:" << *it2 << endl;
//typedef pair<iterator, bool> _Pairib;
//typedef pair<iterator, iterator> _Pairii;
//typedef pair<const_iterator, const_iterator> _Paircc;
//把5元素删除掉
set1.erase(5);
pair<set<int>::iterator, set<int>::iterator> mypair = set1.equal_range(5);
set<int>::iterator it3 = mypair.first;
cout << "it3:" << *it3 << endl; //5 //6
set<int>::iterator it4 = mypair.second;
cout << "it4:" << *it4 << endl; //6 //6
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1 2 3 4 5 6 7 8 9 10
it0:5
num1:1
it1:5
it2:5
it3:6
it4:6
chunli@http://990487026.blog.51cto.com~/c++$
set集合的查找:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
#include <set>
//3 自定义数据类型 排序
//03 仿函数 函数对象 重载() 操作 进行比较大小
//题目:学生包含学号,姓名属性,现要求任意插入几个学生对象到set容器中,
//使得容器中的学生按学号的升序排序
class Student
{
public:
Student(const char *name, int age)
{
strcpy(this->name, name);
this->age = age;
}
protected:
public:
char name[64];
int age ;
};
//函数对象
struct StuFunctor
{
bool operator()(const Student &left, const Student &right)
{
return (left.age < right.age);
}
};
int main()
{
int i = 0;
set<int> set1;
for (i=1; i<10; i++)
{
set1.insert(i);
}
//打印输出
for (set<int>::iterator it = set1.begin(); it != set1.end(); it++)
{
cout<< *it << " ";
}
cout << endl;
set<int>::iterator it1 = set1.lower_bound(5); //大于等于5迭代器
set<int>::iterator it2 = set1.upper_bound(5); //大于5的迭代器
//通过迭代器进行元素的操作
cout<<"it1 "<<*it1<<" "<<"it2 "<<*it2<<endl;
pair <set<int>::iterator, set<int>::iterator> pairIt = set1.equal_range(5);
set<int>::iterator it3 = pairIt.first; //获取第一个
set<int>::iterator it4 = pairIt.second; //获取第二个
cout<<"it3 "<<*it3<<" "<<"it4 "<<*it4<<endl;
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
1 2 3 4 5 6 7 8 9
it1 5 it2 6
it3 5 it4 6
chunli@http://990487026.blog.51cto.com~/c++$
multiset基本操练:
chunli@http://990487026.blog.51cto.com~/c++$ cat main.cpp
#include <iostream>
#include <stdio.h>
using namespace std;
#include <set>
int main()
{
multiset<int> set1;
int tmp = 0;
printf("请输入multiset集合的值:");
scanf("%d", &tmp);
while (tmp != 0)
{
set1.insert(tmp);
printf("请输入multiset集合的值:");
scanf("%d", &tmp);
}
//遍历
for (multiset<int>::iterator it=set1.begin(); it!=set1.end(); it++ )
{
cout << *it << " ";
}
cout << endl;
while (!set1.empty())
{
multiset<int>::iterator it = set1.begin();
cout << *it << " ";
set1.erase(it);
}
return 0;
}
chunli@http://990487026.blog.51cto.com~/c++$ g++ -g -o run main.cpp && ./run
请输入multiset集合的值:4
请输入multiset集合的值:5
请输入multiset集合的值:7
请输入multiset集合的值:83
请输入multiset集合的值:54
请输入multiset集合的值:6
请输入multiset集合的值:4
请输入multiset集合的值:4
请输入multiset集合的值:4
请输入multiset集合的值:0
4 4 4 4 5 6 7 54 83
4 4 4 4 5 6 7 54 83 chunli@http://990487026.blog.51cto.com~/c++$
=====================================
转载于:https://blog.51cto.com/990487026/1827518