在程序中我们经常会用到vector容器,这就是一种顺序容器
顺序容器将单一的数据类型的元素集中起来,根据位置访问他们
顺序容器有: vector list queue
对应的顺序容器适配器有 stack queue priority_queue
迭代器:
在所有的容器中迭代器可以进行前置++,后置++,或者自减,同时可以通过==,!= 进行位置的判断,在vector和queue当中还可以进行迭代器之间的算数运算
简单的原因可以认为只有这两种容器能为元素提供快速,随机的访问,支持根据元素位置进行随机访问
容器中除了iterator正向迭代器 c.begin(),c.end()
还有reverse_iterator反向迭代器 c.rbegin , c.rend()
插入操作:
c.push_back()
只有 list 和queue还有c.push_front()在前面进行插入的操作
insert(p,t)
insert(p,n,t)
insert(p,b,e) 在p前面插入迭代器b和迭代器e之间的元素
注意添加和删除元素都有可能会使容器进行重新加载,容易使迭代器失效
容器大小:
c.size()
c.max_size()
c.empty()
c.resize(n) 调整容器c的长度
c.resize(n,t)调整容器c的大小,增加的元素初始化为t
访问元素:
c.back()
c.front()
只有vetor 和 deque : 通过索引进行访问 c[i]
同时都可以通过迭代器进行元素访问
删除元素:
c.erase() 通过迭代器p删除对应的元素,返回的是删除后面的元素的迭代器
c.erase(b,e) 删除迭代器b,e之间的元素
c.clear()
c.pop_back() 删除最后一个元素
只有list,deque : c.pop_front
赋值操作:
c1 = c2
c1.swap(c2) c1和c2之间的元素互换 赋值和assign操作会导致迭代器失效,但是swap不会
c.assign(b,e) 将迭代器b,e之间的元素赋值到c中,但是注意迭代器不是c对应的迭代器
如果两个容器的类型不同,但是兼容就必须要用assign
capacity 和 reserve
capacity操作表示存储空间之间的元素空间,reserve操作表示预留的存储空间
总结:
vector 和 deque容器提供了对元素的快速访问,但付出的代价是,在容器的任意位置插入或者删除元素,比在容器尾部插入和删除元素开销更大。
list类型在任何位置都能快速插入和删除,但是随机访问的开销比较大,因为list对应的是不连续的内存区域
vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。
list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:
它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。
因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面
的原则:
1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用list
3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque
最后注意一点:
在deque容器的首部和尾部插入元素不会使迭代器失效,删除只会使首尾的迭代器失效,但是在其余位置会是迭代器失效,可能造成指针悬挂
容器适配器:
标准库还有三种容器适配器:queue,priority_queue,stack
适配器是使一事物的行为类似于另一事物行为的一种机制,容器适配器让已经存在的容器使用另一种抽象的容器方式进行工作
stack 关联的基本容器: vector list deque
queue: list 因为需要push_front操作
priority_queue : vector ,deque 因为需要提供随机访问的能力
stack:
s.empty()
s.size()
s.pop()
s.top()
s.push(item)
queue
q.empty()
q.size()
q.pop()
q.front()
q.push()
q.back()
priority_queue
q.empty()
q.size()
q.pop()
q.push()
q.top() 优先级最高的元素