参考
零基础学c++ 杨彦强刘袁红王浩
编写高质量代码 李健
标准STL序列容器:vector,string,deque,list
标准STL关联容器:set,multiset,map,multimap
非标准序列容器:slist(单向链表),rope(重型字符串)
非标准关联容器:hash_set,hash_multiset,hash_map,hash_multimap----散列容器
标准STL容器:数组,bitset,valarray,stack,queue,priority_queue
序列式容器
vector向量(会自动增长的数组)
deque双端队列
list双向链表
vector和deque和list可以使用迭代器访问元素。
vector和deque可以使用下表访问元素,list不可以。
vector和deque和list可以使用push_back()在容器末尾添加元素。
deque和list可以使用push_front()在容器最前面添加元素,vector不可以(可以用insert在最前面插入)。
#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include<algorithm>
using namespace std;
void func(vector<int>::value_type v)
{
cout<<v<<" ";
}
int main()
{
vector<int> obv; //创建一个空的vector
obv.push_back(1);
obv.push_back(9);
cout<<"obv的元素个数为:"<<obv.size()<<endl; //size()用以返回元素的个数
for_each(obv.begin(),obv.end(),func);//使用算法遍历容器
cout<<endl;
double sz[5]={1,2,3,4,5}; //创建double型数组sz
deque<double> obD(sz,sz+5); //创建deque型容器obD,并用sz的首地址和末地址为其初始化,第5种方式
for(deque<double>::size_type i=0;i<obD.size();i++) //对obD中的元素进行随机访问,下标表示法
{
cout<<obD[i]<<" ";
}
cout<<endl; //换行
list<float> obL(3,5); //创建一大小为3的list型容器obL,其中每个元素都初始化为5
list<float>::iterator iter=obL.begin(); //创建list<float>型迭代器,类似指针的概念,并使其指向obL的第一个元素
while(iter!=obL.end()) //while结构,直到iter指向obL的尾部
{
cout<<(*iter)<<" "; //通过迭代器间接访问容器中的元素,和指针相似
iter++; //指向下一个元素
}
cout<<endl; //换行
getchar();
return 0;
}
obv的元素个数为:21 9
1 2 3 4 5
5 5 5
关联式容器
set
multiset
map
multimap
set
#include <iostream>
#include <set> //使用set必须包括此头文件
using namespace std;
int main()
{
int sz[9]={2,1,3,5,4,6,3,5,6}; //定义int型数组,数组名相当于指针(迭代器)
set<int> A(sz,sz+9); //将迭代器区间作为参数创建容器对象A
cout<<A.size()<<endl; //输出A中元素个数
set<int>::iterator it=A.begin(); //创建set<int>::iterator迭代器it,指向A头部
while (it!=A.end()) //输出全部元素
{
cout<<(*it)<<" ";
it++;
}
cout<<endl;
return 0;
}
61 2 3 4 5 6
multiset
#include <iostream>
#include <set> //使用multiset必须包括此头文件
using namespace std;
int main()
{
int sz[9]={2,1,3,5,4,6,3,5,6}; //定义int型数组,数组名相当于指针(迭代器)
multiset<int> A(sz,sz+9); //将迭代器区间作为参数创建容器对象A
cout<<A.size()<<endl; //输出A中元素个数
multiset<int>::iterator it=A.begin();//创建multiset<int>::iterator迭代器it,指向A头部
while (it!=A.end()) //输出全部元素
{
cout<<(*it)<<" ";
it++;
}
cout<<endl;
getchar();
return 0;
}
91 2 3 3 4 5 5 6 6
map
#include <iostream>
#include <map> //使用map容器要包含的头文件
#include <string> //使用string类要包含的头文件
using namespace std;
int main()
{
//创建part<int,string>型数组
pair<int,string> sz[4]={ pair<int,string> (9,"Asia"),pair<int,string> (4,"Africa"),
pair<int,string> (1,"Euro"),pair<int,string> (4,"America") };
map<int,string> obM(sz,sz+4); //用迭代器区间构造obM
cout<<obM.size()<<endl; //输出obM中的元素个数
map<int,string>::iterator it=obM.begin(); //创建map<int,string>模板类的迭代器,指向obM的头部
while (it!=obM.end()) //按顺序逐个输出obM中的元素
{
cout<<(*it).first<<": "<<(*it).second<<endl;
it++;
}
getchar();
return 0;
}
31: Euro
4: Africa
9: Asia
multimap
#include <iostream>
#include <map> //使用multimap容器要包含的头文件
#include <string> //使用string类要包含的头文件
using namespace std;
int main()
{
//创建part<int,string>型数组
pair<int,string> sz[4]={ pair<int,string> (9,"Asia"),pair<int,string> (4,"Africa"),
pair<int,string> (1,"Euro"),pair<int,string> (4,"America") };
multimap<int,string> obM(sz,sz+4); //用迭代器区间构造obM
cout<<obM.size()<<endl; //输出obM中的元素个数
multimap<int,string>::iterator it=obM.begin(); //创建multimap<int,string>模板类的迭代器,指向obM的头部
while (it!=obM.end()) //按顺序逐个输出obM中的元素
{
cout<<(*it).first<<": "<<(*it).second<<endl;
it++;
}
getchar();
return 0;
}
41: Euro
4: Africa
4: America
9: Asia