9.3 顺序容器的操作
9.3.1 容器定义的类型别名
我们已经使用过三种容器定义的类型:size_type、iterator和const_iterator。
9.3.2 begin和end成员
如果容器不是const,则这些操作返回iterator或reverse_iterator类型。如果容器是const,则其返回类型要加上const_前缀,也就是const_iterator和const_reverse_iterator类型。
9.3.3 在顺序容器中添加元素
所有顺序容器都支持push_back操作,提供在容器尾部插入一个元素的功能。
vector<int> m;
m.push_back(100);
m.push_back(1000);
for(vector<int>::iterator beg = m.begin();beg!=m.end();++beg)
{
cout << *beg << endl;
}
除了朴实_back运算,list和deque容器类型还提供了类似的操作:push_front。这个操作实现在容器首部插入新元素的功能。
list<int> m;
m.push_back(100);
m.push_back(1000);
m.push_front(10000);
for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
{
cout << *beg << endl;
}
在容器中添加元素时,系统将元素值复制到容器里。类似地,使用一段元素初始化新容器时,新容器存放的是原始元素的副本。被复制的原始值与新容器中的元素各不相关,此后容器内元素值发生变化时,被复制的原值不会受到影响,反之亦然。
1. 在容器中指定位置添加元素
insert操作提供了一组更通用的插入方法,实现在容器的任意指定位置插入新元素。
list<int> m;
m.push_back(100);
m.push_back(1000);
m.push_front(10000);
m.insert(m.begin(), 1000000);
for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
{
cout << *beg << endl;
}
2. 插入一段元素
insert函数的第二个版本提供在指定位置插入数量相同元素的功能。
insert函数的最后一个版本实现在容器中插入由一对迭代器标记的一段范围内的元素。
int arr[4] = {1, 2, 3, 4};
list<int> m;
m.push_back(100);
m.push_back(1000);
m.push_front(10000);
m.insert(m.begin(), 1000000);
m.insert(m.begin(), 10, 1);
m.insert(m.begin(), arr, arr+4);
for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
{
cout << *beg << endl;
}
3. 添加元素可能会使迭代器失效
任何insert或push操作都可能导致迭代器失效。当编写循环将元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。
4. 避免存储end操作返回的迭代器
由end操作返回的迭代器,在容器的任何位置插入任何元素都会使该迭代器失效。
不要存储end操作返回的迭代器。添加或删除deque或vector容器内的元素都会导致存储的迭代器失效。