我们都知道,stl容器中将容器分为两类,顺序容器和关联容器。
顺序容器有三种即vector,deque,以及list
一:顺序容器的常用操作
1:首先顺序容器的迭代器
定义:T<C>::iterator iter;
/*支持所有顺序容器*/
*iter返回迭代器的引用
iter->mem 对iter解引用,等效于(*iter).men
++iter|iter++自加
--iter|iter--自减
iter1==iter2 | iter1!=iter2比较
/*只支持vector 和deque*/
iter+n | iter-n迭代器加减整数值
iter1+=iter2 | iter1-=iter2迭代器复合运算
iter1-iter2迭代器减法
>,>=,<,<=迭代器关系符!!也可用于迭代器间比较大小
2:迭代器范围
c.begin() | c.rend()指容器中第一个元素,后面是逆序迭代器
c.end() | c.rbegin() 指容器最后一个元素
c.size()返回容器元素个数
c.max_size()返回最多容纳元素个数
c.empty()是否为空,返回布尔值
c.resize(n)调整容器长度大小,使其能够容纳n个元素
c.resize(n,t)容纳n个元素,新添加的都是t
c.capacity()获取当前容器的能够存储的元素总数
c.reverse(n)为容器预留多少空间
3:容器定义的类型别名
size_type无符号整形,容器长度
iterator迭代器类型
const_iterator 只读迭代器类型
reverse_iterator逆序寻址迭代器
const_reverse_iterator只读逆序寻址迭代器
difference_type迭代器差值,可为负值
value_type元素类型
reference元素左值类型
const_reference常量元素左值类型
/*定义方法 C<T>::类型别名 变量;
4:容器的初始化
C<T> c; 创建空容器
C<T> c(c2); 创建容器是从c2的副本
C<T> c(b,e);创建容器是迭代器b到e的副本
C<T> c(n,t);创建由n个t元素初始化
C<T> c(n); 创建由n个初始化的容器
5:添加及删除元素
c.push_back()尾部添加元素
c.push_front()首部添加元素,不适用与vector
c.insert(p,t)迭代器p位置添加t
c.insert(p,n,t)迭代器p位置添加n个t
c.insert(p,b,e)迭代器p位置更新为某段迭代器b到e中的元素
删除元素
c.erase(p)删除迭代器p位置的元素
c.erase(b,e)删除迭代器b到e范围内的元素
c.clear()清空所有元素
c.pop_back()删除容器最后一个元素
c.pop_front()删除第一个元素,不适用于vector
6:访问容器元素
c.back()返回容器最后一个元素引用
c.front()返回第一个元素引用
c[i] | c.at(i)返回第i个元素引用,不适用于list
7:赋值与swap
c1=c2c1赋值为c2,删除c1中元素,复制c2到c1
c1.swap(c2)交换c1与c2中的元素
c.assign(b,e)用迭代器b到e的元素更新全部的c
c.assign(n,t)c中更新为n个t
二:顺序容器间的区别及容器的选用
1:vector和deque能够随机的访问元素,vector和deque对操作符“ [] ”重载了,而list没有,我们我们只能通过迭代器访问,而不能通过下标访问。
2:在中间位置插入元素次数较多是优先选择list,如果在首部和尾部插入较多是优先选择deque。
3:编程中容器可以交叉是用以提高效率,如果只是在读取的时候要在中间插入元素,而需要随机访问元素的话,我们可以用list读入,然后复制到vector中操作。
注意:我们知道vector是连续分配内存的,那么如果添加入新元素后这一块内存满了,那么vector必须找一块儿更大的内训,把当前的元素复制过去,然后释放之前的内存,这样的操作如果多次的话很浪费时间,解决办法是定义容器是就分配空间,适当多预留空间,那么久不会出现全部元素复制的情况。
练习代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <list>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 11000;
int main()
{
/*9.1.1*/
vector<int> ievel;
vector<string> svec;//(get_word_count("Chimera"));
svec.push_back("i ccc");
svec.push_back("yang can");
svec.insert(svec.begin()+1,"momo");
svec.insert(svec.begin()+1,5,"hahha");
string s[10]={"what","is","your","name"};
svec.insert(svec.begin()+1,s,s+4);
vector<string>::iterator i=svec.begin();
svec.erase(i+0);
//svec.erase(i,i+2);
for(int i=0;i<svec.size();i++)
cout<<svec[i]<<endl;
cout<<"---->"<<svec[10]<<endl;
cout<<"xxxxx"<<svec.at(10)<<endl; //另一种访问办法,下标超抛出out_of_range
/*vector<string>::const_reverse_iterator ii;
for(ii=svec.rbegin();ii!=svec.rend();ii--){
cout<<*ii<endl;
}*/
/*list<string> slist(svec.begin(),svec.end());
list<string>::iterator it;
for(it=slist.begin();it!=slist.end();it++)
cout<<*it<<endl;
const list<int>::size_type ll=64;//注意类型
list<string> ls(ll,"eh?");
for(it=ls.begin();it!=ls.end();it++){}
//cout<<*it<<endl;
/*9.1.2
vector<vector<string> > v;
vector<string> s1;
v.push_back(s1);*/
list<int> lis(10,42);
lis.resize(15); //调整容器大小
lis.resize(25,-1); //可选参数初始值
//lis.resize(5);
list<int>::iterator it=lis.begin();
for(;it!=lis.end();it++)
{
cout<<*it<<endl;
}
return 0;
}
STL顺序容器【vector】【deque】【list】,布布扣,bubuko.com
原文地址:http://blog.csdn.net/y990041769/article/details/38304053