【语法回顾】C++STL:容器(一)
2012-07-12 12:05
by
ATP_,
968
阅读,
0
评论,
收藏,
编辑
一.顺序容器的定义
顺序容器,它将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素,这就是顺序容器。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定的。
标准库定义来三种顺序容器:vector,list,deque(双端队列读音”deck”)
三种顺序容器的适配器:stack,queue,priority_queue
相关头文件
#include<vector> #include<list>
#include<deque> #include<stack> #include<queue>
容器的初始化(4种)
vector<int> ivec; //默认构造函数
vector<int> c(c2); //创建容器 c2的副本
vector<int> c(n, t); //用n个值为t 的元素创建并初始化容器
list<string> mylist(3, “haha”); // 3个”haha”字符串初始化list
list<string> mylist1(mylist.begin(), mylist.end()); // 初始化为其他容器的一部分
容器操作的特殊要求
容器的存储类类型的对象,只有当其元素类型提供默认构造函数时,才可以使用容器
Car类没有默认构造函数,但是含有一个int形参的构造函数
1
2
3
4
5
|
vector<Car> cars; // 正确,没有调用默认构造函数
vector<Car> cars(10); //错误,该声明的含义是定义并初始化10个Car类的对象,调用了默认构造函数,但是Car没有提供
vector<Car> cars(10, 1); //正确,调用来int形参的构造函数
|
二.容器的容器
vector< vector<string> > lines; //必须用空格间隔开两个>符号
A.迭代器常用运算
*iter //返回迭代器iter所指向元素的引用
iter->number // 当容器中的元素为结构体或类时,相当于对其解引用,并返回number成员值
iter++; iter--; //迭代器的自增自减
iter1 == iter2 //当iter1和iter2指向同一容器的同一元素时相等,或者同时指向.end();
只有vector和deque中,迭代器支持的算数运算: iter+n -n, iter1 + iter2 – iter3; 关系运算:>,<,>=,<=
注意:在使用迭代器时,必须留意哪些操作会使迭代器失效,比如增删等操作。例:当vector在执行来push_back的操作后,就不能再信任之前的iterator值了
B.容器定义的类型别名(常用)
size_type // 无符号整型,足以存储最大长度可能的容器长度
iterator // 此容器的迭代器类型
reverse_iterator // 此容器按逆序寻址的迭代器
const_iterator // 只读迭代器
const_reverse_iterator // 只读逆序迭代器
三.容器的常用操作
A.在顺序容器中添加人元素的操作(原迭代器可能失效)
c.push_back(t) // 在容器c的尾部添加
c.push_front(t) // 在容器c 的前端添加
c.insert(iter, t) //在迭代器iter所指位置前添加元素t
c.insert(iter, iterA, iterB) // 在迭代器iter所指位置前添加有迭代器iterA,iterB所限制范围内的元素
注意:容器元素的插入,复制结果都是原数据的副本,互不影响。
B.容器大小的操作
c.size() // 返回元素个数,类型为 c::size_type
c.empty()
c.resize(n) // 调整容器的长度大小,使其能够枸容纳n个元素
c.resize(n,t) // 新增的范围都以元素t来填充
C.元素的访问
c.back() //返回容器c的最后一个元素的引用
c.front() //返回容器的第一个元素的引用
c[n] //下标操作,只有vector,deque (string) 可以使用
D.删除元素
c.erase(p) // 删除迭代器p所指向的元素
c.erase(b, e) //删除迭代器b,e之间的元素
c.pop_back() //删除容器最后一个元素
c.pop_front() //删除容器第一个元素
c.clear() // 清空容器
c1.swap(c2) // c1,c2存放内容交换
c.assign(b, e) //重新设置c的元素,将迭代器b,e之间的元素复制到c中去,b,e必须不是指向c中元素的迭代器