迭代器iterator
从后向前的迭代器
vector test;
vector::reverse_iterator iter;
for(iter=test.rbegin();iter!=test.rend();++iter)
const_iterator只能读取数据,不能修改
for(vector::const_iterator iter=test.begin();iter!=test.end();++iter)
Vector
//删除指定位置的数据,返回下一个数据的位置
iterator erase(iterator position);
//删除[begin,end)
iterator erase(iterator begin,iterator end);
要删除一个vector连续的某个数值,注意写法为:
for(vector::iterator iter=test.begin();iter!=test.end();)
{
if(*iter==24)
{
test.erase(iter);
}
else{
iter++;
}
}
或者
#
include<
algorithm>
test.erase(remove(test.begin(),test.end(),24),test.end());
获得vector中数据的个数
int nSize== test.empty() ? -1 : static_cast(test.size());
List
list的节点无需分配指定的内存大小且可以任意伸缩,因为它存储在非连续的内存空间中,因此可以快速地插入删除而不能随机访问。
//合并两个list
//将l2添加到l1的末尾
l1.merge(l2);
//指定添加的位置iter
l1.splice(iter,l2);
list的unique是比较相邻的元素,去掉相邻元素中重复。要去除所有重复的元素,要先对容器中的元素排序sort。
vector是一段连续的内存块,而deque是多个连续的内存块,list是所有元素分开保存。如果需要随机存取又关心两端数据的插入和删除,deque是最好的。
关联容器
set、multiset、map、multimap是非线性的树结构(红黑树)。
set通过链表的方式组织。
容器适配器
STL中包含三种适配器,栈stack、队列queue和优先级priority_queue。适配器保存元素的机制是调用一种顺序容器去实现。默认情况下,stack和queue基于deque实现,priority_queue基于vector实现,在创建一个适配器时可以指定具体的实现容器,但是由于适配器的特点,一个适配器不是可以由任意一个顺序容器都可以实现。
栈stack关联的容器可以是任意一种顺序容器。
队列queue关联的容器必须提供pop_front操作, 其不能使用vector。
deque
<
int> container(5,10);
stack<
int>=mystack(container);
Efficient STL
一、当对象很大时,建立指针的容器而非对象的容器。STL基于拷贝的方式来工作,任何需要放入STL中的元素,都会被复制。
1.容器销毁前需要手动销毁指针所指向的对象,否则会造成内存泄露。
2.使用排序等算法时,需要构造基于对象的比较函数。此时默认的比较函数是基于指针大小的比较。
二、使用empty()函数检查是否为空,不要使用size()。对于List,size()会遍历每一个元素来确定大小。
三、对于Vector,新增元素时空间不够,会执行:
1.分配当前空间的两倍空间。
2.将当前元素拷贝到新的空间中。
3.释放之前的空间,将新元素写入新空间指定位置。
使用vector,最后事先确定大小。
四、