9.3.7 删除元素
1. 删除第一个或最后一个元素
pop_front和pop_back函数用于删除容器内的第一个和最后一个元素。但vector容器类型不支持pop_front操作。这些操作删除指定的元素并返回void。
pop_front和pop_back函数的返回值并不是删除的元素值,而是void。要获取删除的元素值,则必须在删除元素之前调用front或back函数。
2. 删除容器内的一个元素
删除一个或一段元素更通用的方法是erase操作。该操作有两个版本:删除由一个迭代器指向的单个元素,或删除由一对迭代器标记的一段元素。erase的这两种形式都返回一个迭代器,它指向被删除元素或元素段后面的元素。
如同其他操作一样,erase操作也不会检查它的参数。程序员必须确保用作参数的迭代器或迭代器范围是有效的。
3. 删除容器内所有元素
要删除容器内所有的元素,可以调用clear函数,或将begin和end迭代器传递给erase函数。
erase、pop_front和pop_back函数使指向被删除元素的所有迭代器失效。对于vector容器,指向删除点后面的元素的迭代器通常也会失效。而对于deque容器,如果删除时不包含第一个元素或最后一个元素,那么该deque容器相关的所有迭代器都会失效。
9.3.8 赋值与swap
赋值和assign操作时做操作数容器的所有迭代器失效。swap操作则不会使迭代器失效。完成swap操作后,尽管被交换的元素已经存放在另一容器中,但迭代器仍然指向相同的元素。
assign操作首先删除容器中所有的元素,然后将其参数所指定的新元素插入到该容器中。
由于assign操作首先删除容器中原来存储的所有元素,因此,传递给assign函数的迭代器不能指向调用该函数的容器内的元素。
带有一对迭代器参数的assign操作允许我们将一个容器的元素赋给另一个不同类型的容器。
vector<int> i(1, 2);
list<int> m;
m.assign(i.begin(), i.end());
for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
{
cout << *beg << endl;
}
assign运算的第二个版本需要一个整型数值和一个元素值做参数,它将容器重置为存储指定数量的元素,并且每个元素的值都为指定值。
list<int> m;
m.assign(2,3);
for(list<int>::iterator beg = m.begin();beg!=m.end();++beg)
{
cout << *beg << endl;
}
2. 使用swap操作以节省删除元素的成本
swap操作实现交换两个容器内所有元素的功能。要交换的容器的类型必须匹配:操作数必须是相同类型的容器,而且所存储的元素类型也必须相同。
swap操作不会删除或插入任何元素,而且保证在常量时间内实现交换。对于容器内没有移动任何元素,因此迭代器不会失效。
没有移动元素这个事实意味着迭代器不会失效。
list<int> i(1, 2);
list<int> m;
m.assign(2,3);
i.swap(m);