一、vector(相当于数组,但可以动态分配空间)(单向)
1.vector的构造函数
(1)直接构造
# include <vector>
vector<int> v;
(2)
# include <vector>
vector<int> v2(v1.begin(),v1.end());//将v1全盘复制给v2
(3)
# include <vector>
vector<int> v(10,100);//在v中插入10个100
(4)
# include <vector>
vector<int> v1(v2);//将v2复制给v1
2.vector的赋值
(1)
# include <vector>
vector<int> v;
v.assign(10,100);//v赋值10个100
(2)
# include <vector>
vector<int> v1;
v1.assign(v2.begin(),v2.end());//将v2赋值给v1
(3)
# include <vector>
vector<int> v1;
v1=v2;//将v2赋值给v1
3.vector大小和容量
# include <vector>
vector<int> v;
v.empty();//如果v为空则返回真,不为空则返回假
v.capacity();//返回容器的容量大小
v.size();//返回容器的元素个数
v.resize(int num);//重新指定容器的长度为num,若容器变长,则以0填充,若容器变短,则删除后面的数据
v.resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充,若容器变短,则删除后面的数据
4.vector插入与删除
(1)尾插
# include <vector>
vector<int> v;
v.push_back(10);//插入一个10
(2)尾删
# include <vector>
vector<int> v;
v.pop_back();//删除最后一元素
(3)插入
# include <vector>
vector<int> v;
v.insert(v.begin(),100);//在v的开头插入100
v.insert(v.begin(),2,100);//在v的开头插入2个100
(4)删除
# include <vector>
vector<int> v;
v.erase(v.begin());//删除第一个元素
v.erase(v.begin(),v.end());//清空
v.clear();//清空
5.vector数据的存取与互换
(1)获取
# include <vector>
using namespace std;
vector<int> v;
cout<<v.at(3)<<endl;//输出第三个元素
cout<<v[3]<<endl;//输出第三个元素
cout<<v.front()<<endl;//输出第一个元素
cout<<v.back()<<endl;//输出最后一个元素
(2)互换
# include <vector>
vector<int> v1;
vector<int> v2;
v1.swap(v2);//将v1和v2互换
6.vector预留空间
# include <vector>
vector<int> v;
v.reserve(100);//提前预留出100的空间,不需要再后续动态分配空间
7.vector的输出
# include <vector>
using namespace std;
vector<int> v;
//第一种输出方式
for(vector<int>::iterator it=v.begin();it!=v.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
//第二种输出方式
# include <algorithm>
void f(int a)
{
cout<<a<<endl;
}
for_each(v.begin(),v.end(),f);//调用"algorithm"中的for_each遍历函数
8.vector的嵌套与输出
# include <vector>
vector<vector<int>> v;
vector<int> v1;
vector<int> v2;
for(int i=0;i<2;++i)
{
v.push_back(i+1);
v.push_back(i+2);
}
v.push_back(v1);
v.push_back(v2);
for(vector<vector<int>>::iterator it=v.begin();it!=v.end();++it)
{
for(vector<int>::iterator it1=(*it).begin();it!=(*it).end();++it1)
{
cout<<*it1<<endl;
}
}
二、string容器
1.string构造函数
# include <string>
//第一种
string str;
//第二种
const char* str1="Hello C++";
string str2(str1);//将str1复制给str2
//第三种
string str1;
string str2(str1);//将str1赋值给str2
//第四种
string str(10,'a');//str初始化为10个'a'
2.string的赋值
# include <string>
//第一种
string str;
str="Hello World!";
//第二种
string str1,str2;
str1=str2;
//第三种
string str;
str='a';
//第四种
string str;
str.assign("Hello C++");
//第五种
string str;
str.assign("Hello C++",5);//赋值字符串的前五个
//第六种
string str;
str.assign(str1);//将上str1赋值给str
//第七种
string str;
str.assign(10,'a');//str赋值10个'a'
3.string追加
# include <string>
//第一种方式
string str;
str="I";
str=str+"like";
cout<<str<<endl;//输出I like
//第二种方式
string str1,str2;
str1="I like";
str2="game";
str2=str2+str1;
cout<<str2<<endl;//输出"I like game"
//第三种方式
string str,str1;
str1="abcdef";
str="I";
str.append("like");//在str后面追加like
str.append("game",5);//在str后面继续追加game
str.append(str1,2,3);//在str后面追加从str1下标为2的后面3个,即追加cde
4.string查找
# include <string>
//find查找
string str="abcdefg";
int a=str.find("de");//从左向右查找,找到后就返回de中d的位置序号,即3;没有找到就返回-1
//rfind查找
string str="abcdefg";
int a=str.rfind("de");//从右向左查找,找到后就返回de中d的位置序号,注意位置序号还是从左向右,即3;没有找到就返回-1
5.string替换
# include <string>
string str;
str="abcdefg";
str.replace(1,3,"111");//将序号为1的位置起的3个字符换为"111";
6.string对比
# include <string>
string str1,str2;
int a=str1.compare(str2);//如果str1=str2,就返回0;如果str1>str2,就返回1;如果str1<str2,就返回-1
7.string单个字符的存取
# include <string>
string str;
str="Hello World!";
//第一种输出方法
for(int i=0;i<str.size();++i)//str.size()可以返回str里面元素个数
{
cout<<str.at(i);<<endl;
}
//第二种输出方法
for(int i=0;i<str.size();++i)//str.size()可以返回str里面元素个数
{
cout<<srt[i]<<endl;
}
8.string的插入与删除
# include <string>
string str;
str="Hello C++";
//插入
str.insert(1,"111");//在序号为1的位置插入"111",即变为H111ello C++
//删除
str.erase(1,3);//从序号为1的位置开始删除三个元素,即变为Ho C++
9.string的截取
# include <string>
string str="zhang@qq.com";
int a=str.find("@");
string str1=str.substr(0,a);//从0号位置开始截取a个
cout<<str1<<endl;//输出zhang
三、deque容器(双向)
1.dedque的构造函数
(1)直接构造
# include <deque>
deque<int> d;
(2)
# include <deque>
deque<int> d2(d1.begin(),d1.end());//将v1全盘复制给v2
(3)
# include <deque>
deque<int> d(10,100);//在v中插入10个100
(4)
# include <deque>
deque<int> d1(v2);//将v2复制给v1
2.deque的赋值
(1)
# include <deque>
deque<int> d;
d.assign(10,100);//v赋值10个100
(2)
# include <deque>
deque<int> d1;
d1.assign(d2.begin(),d2.end());//将v2赋值给v1
(3)
# include <deque>
deque<int> d1;
d1=d2;//将v2赋值给v1
3.deque的大小和容量
# include <deque>
deque<int> d;
d.empty();//如果d为空则返回真,不为空则返回假
//d.capacity();//特别注意deque没有capacity这一属性
d.size();//返回容器的元素个数
d.resize(int num);//重新指定容器的长度为num,若容器变长,则以0填充,若容器变短,则删除后面的数据
d.resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充,若容器变短,则删除后面的数据
4.deque的删除和插入
# include <deuqe>
deuqe<int> d1;
deuqe<int> d2;
d1.insert(d1.begin(),100);//在d1的开头插入100
d1.insert(d1.begin(),2,100);//在d1的开头插入2个100
d1.insert(d1.begin(),d2,begin(),d2,end());//在di的开头插入d2
deuqe<int> d2;
d2.erase(d2.begin());//删除第一个元素
d2.erase(d2.begin(),d2.end());//清空
d2.clear();//清空
5.deque的存取
# include <deque>
using namespace std;
deque<int> d;
cout<<d.at(3)<<endl;//输出第三个元素
cout<<d[3]<<endl;//输出第三个元素
cout<<d.front()<<endl;//输出第一个元素
cout<<d.back()<<endl;//输出最后一个元素
6.deque的排序
# include <deque>
# include <algorithm>
deque<int> d;
sort(d.begin(),d.end());//用sort()函数要加上"# include <algorithm>"头文件,从小到大排序
四、stack容器(栈)(先进后出)
# include <stack>
stack<int> s;
s.empty();//若s为空则返回1,不为空则返回0
s.size();//返回栈中元素的个数
s.push(1);//向栈中插入元素1
s.top();//返回栈顶元素
s.pop();//删除栈顶元素
五、queue容器(队列)(先进先出)
# include <queue>
queue<int> q;
q.empty();//若q为空则返回1,不为空则返回0
q.size();//返回栈中元素的个数
q.push(1);//元素1从队尾入队
q.front();//返回对头元素
q.back();//返回对尾元素
q.pop();//删除队头元素
六、list容器(链表)
1.list的构造函数
# include <list>
list<int> l;//直接构造
list<int> l1(l2.begin(),l2.end());
list<int> l1(l2);
list<int> l(10,100);//赋值10个100
2.list的大小和容量
# include <list>
list<int> l;
l.size();
l.empty();
l.resize(10);
l.resize(5,4);//大小变为5,多的部分用4来补充
3.list的赋值和交换
(1)赋值
# include <list>
list<int> l;
l.assign(10,100);//l赋值10个100
(2)
# include <list>
list<int> l1;
l1.assign(l2.begin(),l2.end());//将l2赋值给l1
(3)
# include <list>
list<int> l1;
l1=l2;//将l2赋值给l1
(2)交换
# include <list>
list<int> l2,l3;
l2.swap(l3);//交换l2和l3
4.list数据的存取
# include <list>
list<int> l;
l.front();//返回l的第一个元素
l.back();//返回l的最后一个元素
//注意:list不支持l[i]和l.at(i),即不支持随机访问
5.list的反转
# include <list>
list<int> l;
l.reverse();//反转容器中的元素,即第一个和最后一个互换
6.list的排序
# include <list>
list<int> l;
//第一种:默认排序,从小到大
l.sort();
//第二种:指定规则排序
bool compare(int a,int b)
{
return a>b;//从大到小排序
}
l.sort(compare);
for(list<int,compare>::iterator it=l.begin();it!=l.end();++it)
{
cout<<*it<<endl;
}
//第三种:高级排序
class student
{
public:
student(string m_name,int m_age,int m_weight)
{
name=m_name;
age=m_age;
weight=m_weight;
}
string name;
int age;
int weight;
}
bool compare(student& stu1,student& stu2)
{
if(stu1.age==stu2.age)
{
return stu1.weight>stu2.weight;
}
else
{
return stu1.age>stu2.age;
}
}
list<student> l;
l.sort(compare);//先排年龄,年龄相同排体重
for(list<student,compare>::iterator it=l.begin();it!=l.end();++it)
{
cout<<"Name="<<it->name<<"age"<<it->age<<"weight"<<it->weight<<endl;
}
七、set容器
1.set的赋值
# include <set>
set<int> s;
s.insert(10);//set只能用insert插入,不能用push_back()等
s.insert(20);
s.insert(20);//error,set容器不允许插入重复值
s.insert(5);//set容器会自动排序,从小到大排序
2.set的大小和交换
# include <set>
set<int> s1,s2;
s1.size();
s1.empty();
s1.swap(s2);//交换是s1和s2
3.set的插入与删除
# include <set>
set<int> s;
s.insert(20);//插入20
s.erase(s.begin());//删除set容器的头部
s.erase(30);//删除set容器中30那个元素
s.erase(s.begin(),s.end());//清空
s.clear();//清空
4.set的统计与查找
# include <set>
set<int> s;
set<int>::iterator it=s.find(30);
if(it!=s.end())
{
cout<<"找到了30这个元素"<<endl;
}
else
{
cout<<"m没有找到了30这个元素"<<endl;
}
int num=s.count(30);//统计set容器中30的个数
5.set的排序
# include <set>
class compare
{
public:
bool operator()(int a,int b)//operator是固定的,不是随便的函数名
{
return a>b;//从大到小排序
}
}
set<int,compare> s;//set容器的排序必须在定义的时候就指定
s.insert(10);
s.insert(40);
s.insert(30);
s.insert(20);
for(set<int,compare>::iterator it=s.begin();it!=s.end();++it)
{
cout<<*it<<" ";
}
cout<<endl;
7.set自定义消息排序
# include <set>
class student
{
public:
student(string m_name,int m_age,int m_weight)
{
name=m_name;
age=m_age;
weight=m_weight;
}
string name;
int age;
int weight;
}
class compare
{
public:
bool operator()(const student& stu1,const student& stu2)
{
if(stu1.age==stu2.age)
{
return stu1.weight>stu2.weight;
}
else
{
return stu1.age>stu2.age;
}
}
}
set<student,compare> s;//先排年龄,年龄相同排体重
for(set<int,compare>::iterator it=s.begin();it!=s.end();++it)//输出
{
cout<<*it<<" ";
}
cout<<endl;
6.set和multiset的区别
set容器中不能插入重复数字,但是multiset中可以插入重复数字;使用set和multiset都只用写头文件“# include <set>”,没有头文件“# include <multiset>”
八、pair容器(对组)
//不用包含什么头文件
//第一种创建方式
pair<string, int>p("aaa",20);
cout<<p.first<<p.second<<endl;
//第二种创建方式
pair<string,int>p=make_pair("aaa",20);//使用make_pair的方式
cout<<p.first<<p.second<<endl;
九、map容器
1.map的构造函数
# include <map>
map<int,int>m;//默认构造
map<int,int>m1(m2);//将m2赋值给m1
map<int,int>m1;//赋值
m1=m2;
2.map的插入与输出
# include <map>
map<int,int> m;
m.insert(pair<int,int>(1,10));//插入
void printfmap(map<int,int>& m)//输出
{
for(map<int,int>::iterator it=m.begin();it!=m.end();++it)
{
cout<<"key="<<it->first<<"value="<<it->second<<endl;
}
cout<<endl;
}
3.map的大小和交换
# include <map>
map<int,int> m,m1;
m.size();//返回容器中元素的个数
m.empty();//判断容器是否为空
m.swap(m1);//交换容器m和容器m1
4.map的插入与删除
# include <map>
map<int,int> m;
m.insert(pair<int,int>(1,10));//第一种插入方式
m.insert(make_pair(1,10));//第二种插入方式
m.insert(map<int,int>::value_type(3,30));//第三种插入方式
m[4]=40;//第四种插入方式
m.erase(m.begin());//删除第一个元素
m.erase(3);//删除第三个元素
m.erase(m.begin(),m.end());//清空
m.clear();//清空
5.map的查找和统计
# include <map>
map<int,int> m;
map<int,int>::iterator it=m.find(3);//查找
if(it!=m.end())
{
cout<<"找到key值为3的元素"<<endl;
}
else
{
cout<<"没有找到"<<endl;
}
int num=m.count(3);//统计,其实结果只能是1或者0
cout<<"元素中key值为3的个数是:"<<num<<endl;
6.map的排序
# include <map>
class compare
{
public:
bool operator()(int a,int b)
{
return a>b;
}
};
map<int,int,compare> m;
for(map<int,int,compare>::iterator it=m.begin();it!=m.end();++it)//按照指定顺序输出
{
cout<<"key="<<it->first<<"value="<<it->second<<" ";
}
cout<<endl;
/*map自定义数据类型的排序*/
# include <iostream>
# include <map>
# include <ctime> //time()函数所在库(或者"time.h")
# include <stdlib.h> //rand()函数和srand()函数所在库
using namespace std;
class student
{
public:
student(int m_age,int m_weight)
{
age=m_age;
weight=m_weight;
}
int age;
int weight;
};
class compare
{
public:
bool operator()(student stu1,student stu2)
{
if(stu1.age==stu2.age)
return stu1.weight>stu2.weight;
else
return stu1.age>stu2.age;
}
};
int main (void)
{
srand ( time ( NULL ) );
//cout << rand() % a + b << endl;//可以产生b+(0~a-1)范围的数字
map<student,int,compare> m;
student stu1((rand() % 10 + 51),(rand() % 10 + 51));
student stu2((rand() % 10 + 51),(rand() % 10 + 51));
student stu3((rand() % 10 + 51),(rand() % 10 + 51));
student stu4((rand() % 10 + 51),(rand() % 10 + 51));
m.insert(make_pair(stu1,29));
m.insert(make_pair(stu2,89));
m.insert(make_pair(stu3,78));
m.insert(make_pair(stu4,45));
for(map<student,int,compare>::iterator it=m.begin();it!=m.end();++it)
{
cout<<"first.age:"<<(*it).first.age<<"first.weight:"<<(*it).first.weight<<"second:"<<it->second<<endl;
}
return 0;
}
6.map和multimap的区别
map的key值不同重复,multimap中的key值可以重复
十、容器应用实例
(1)创建10名员工,分别随机在三个部门,随机拥有工资,输出员工信息
# include <iostream>
# include <string>
# include <vector>
# include <ctime>
# include <stdlib.h>
# include <map>
using namespace std;
#define Chinese 0
#define Math 1
#define English 2
class worker
{
public:
int salary;
string name;
};
//创建员工
void createworker(vector<worker>& w)
{
string nameseed="ABCDEFGHIJ";
for(int i=0;i<10;++i)
{
int a=rand() % 10000 + 10000;//可以产生b+(0~a-1)范围的数字
worker wk;
wk.name="Worker";
wk.name+=nameseed[i];
wk.salary=a;
w.push_back(wk);
}
}
//员工分组
void setgroup (vector<worker>& v,multimap<int,worker>& m)
{
for(vector<worker>::iterator it=v.begin();it!=v.end();++it)
{
int depId=rand()%3;
m.insert(make_pair(depId,*it));
}
}
void showworker (multimap<int,worker>& m)
{
cout<<"Chinese:"<<endl;
multimap<int,worker>::iterator it=m.find(0);
int num=m.count(0);
for(int i=0;it!=m.end()&&i<num;++it,++i)//map和multimap可以自动排序
{
cout<<"name:"<<it->second.name<<" "<<"salary:"<<it->second.salary<<endl;
}
cout<<"-----------------"<<endl;
cout<<"Math:"<<endl;
it=m.find(1);
num=m.count(1);
for(int i=0;it!=m.end()&&i<num;++it,++i)//map和multimap可以自动排序
{
cout<<"name:"<<it->second.name<<" "<<"salary:"<<it->second.salary<<endl;
}
cout<<"-----------------"<<endl;
cout<<"English:"<<endl;
it=m.find(2);
num=m.count(2);
for(int i=0;it!=m.end()&&i<num;++it,++i)//map和multimap可以自动排序
{
cout<<"name:"<<it->second.name<<" "<<"salary:"<<it->second.salary<<endl;
}
}
int main (void)
{
srand ( time ( NULL ) );
//创建员工
vector<worker> wk;
createworker(wk);
//员工分组
multimap<int,worker> mk;
setgroup (wk,mk);
//员工显示
showworker(mk);
return 0;
}