容器
一、顺序容器:
1、 概念
它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,即为顺序容器。
2、类型
标准库定义了三种顺序容器的类型:vector、list、deque。
Vector相当于c语言中的数组,list相当于c语言中的链表,而deque则是双端可以插入的vector。
3、语法:
C<T> c; 建立一个空的容器
C c(c2); 把从c2中的内容复制给c
C c(b,e); 把b和e之间的内容复制给容器
容器的容器
vector<vector<string>> lines;
4、在顺序容器中的操作
(1)将元素值复制到容器中
c.push_back(t); //顺序容器都支持的操作
c.push_front(t); //只适用于list和deque容器类型
c.insert(p,t); //在迭代器p所指向的元素前面插入值为t的新元素
(2)访问顺序容器内元素的操作
c.back()//返回容器c的最后一个元素的引用
c.front()//返回容器c的第一个元素的引用
c[n]//返回下标为n的元素的引用只适用于vector和deque容器
c.at(n)//返回下标为n的元素的引用只适用于vector和deque容器
(3)删除元素
c.erase(p) //删除迭代器p所指向的元素,返回一个迭代器,它指向被删除元素后面的元素
c.erase(b,e) //删除迭代器b和e所标记的范围内所有的元素
c.clear() //删除容器c内的所有元素,返回void
c.pop_back() //删除容器c的最后一个元素,返回void
c.pop_front() //删除容器c的第一个元素,返回void 只适用于list和deque容器
(4)赋值与swap
c1=c2删除容器c1的所有元素,然后将c2的元素复制给c1
c1.swap(c2)交换内容:调用完该函数后,c1中存放的是c2原来的元素,C2中存放的则是c1原来的元素。C1和C2的类型必须相同,该函数的执行速度通常要比将c2复制到C1的操作快。
5、迭代器和迭代器范围
*iter返回迭代器iter所指向的元素的引用
iter->mem对iter进行解引用,获取指定元素中名为mem的成员,等效于(*iter).mem
vector和deque支持通过元素位置实现的随机访问,因此它们的迭代器可以有效地实现算数和关系运算。
用于计算vector对象的中点位置:
vector<int>::iterator iter = vec.begin() + vec.size()/2
list容器的迭代器既不支持算数运算(加法或减法),也不支持关系运算(<=,<,>=,>),它只提供前置和后置的自增、自减运算以及相等(不等)运算。
list<int> ilist(vec.begin(),vec.end());
ilist.begin() + ilist.size()/2; //error
6、选择容器类型的法则:
(1)如果程序要求随机访问元素,则应使用vector或deque容器
(2)如果程序必须在容器的中间位置插入或删除元素,则应采用list容器
(3)如果程序不是在容器的中间位置,而是在容器首部或尾部插入或删除元素,则采用deque容器
容器小结:
1、标准库的顺序容器有三个类型
vector:支持随机访问
list:不支持随机访问
deque:支持随机访问
2、 容器的常用操作:
插入:push_back(),insert()
删除:erase()
访问:back()
二、容器算法:
使用泛型算法必须包含algorithm头文件:#include <algorithm>
标准库还定义了一组泛化的算数算法:#include <numeric>
1、 算法accumulate
int sum = accumulate(vec.begin(),vec.end(),42); //sum设置为vec的元素之和再加上42
string sum = accumulate(v.begin(),v.end(),string(“”));
2、 算法replace
replace(ilist.begin(),ilist.end(),0,16); //把0替换为16
3、 算法count
int times = count(ivec.begin(),ivec.end(),0); //替换出现的次数
4、 排序算法
bool cmp(int i,int j) {return i>j;}
int main()
{
vector<int> vec;
for(int i=10;i>-1;i--)
{
Vec.push_back(i);
}
sort(vec.begin(),vec.end(),cmp);
for(int i=0;i<vec.size();i++)
{
cout<< vec[i] << “ ”;
}
cout << endl;
return 0;
}
5、 Find_if算法
bool find_5(int i) {return i==5;}
int main()
{
vector<int>vec;
for(inti=0;i<10;i++)
vec.push_back(i);
vector<int>::iteratorit = find_if(vec.begin(),vec.end(),find_5);
if(it!=vec.end())
cout<< *it << endl;
return 0;
}