删除元素
|
c.erase(p) |
删除迭代器 p 所指向的元素返回一个迭代器,它指向被删除元素后面的元素。如果 p 指向容器内的最后一个元素,则返回的迭代器指向容器的超出末端的下一位置。如果 p 本身就是指向超出末端的下一位置的迭代器,则该函数未定义 |
|
c.erase(b,e) |
删除迭代器 b 和 e 所标记的范围内所有的元素返回一个迭代器,它指向被删除元素段后面的元素。如果 e 本身就是指向超出末端的下一位置的迭代器,则返回的迭代器也指向容器的超出末端的下一位置 |
|
c.clear() |
删除容器 c 内的所有元素。返回 void |
|
c.pop_back() |
删除容器 c 的最后一个元素。返回 void。如果 c 为空容器,则该函数未定义 |
|
c.pop_front() |
删除容器 c 的第一个元素。返回 void。如果 c 为空容器,则该函数未定义只适用于 list 或 deque 容器 |
删除第一个或最后一个元素
pop_front 和 pop_back 函数用于删除容器内的第一个和最后一个元素。但vector 容器类型不支持 pop_front 操作。这些操作删除指定的元素并返回void。
pop_front 操作通常与 front 操作配套使用,实现以栈的方式处理容器:
while (!ilist.empty()) {
process(ilist.front()); // do something with the current top of ilist
ilist.pop_front(); // done; remove first element
}
pop_front 和 pop_back 函数的返回值并不是删除的元素值,而是 void。要获取删除的元素值,则必须在删除元素之前调用notfront 或 back 函数。
删除容器内的一个元素
删除一个或一段元素更通用的方法是 erase 操作。该操作有两个版本:删除由一个迭代器指向的单个元素,或删除由一对迭代器标记的一段元素。erase的这两种形式都返回一个迭代器,它指向被删除元素或元素段后面的元素。也就是说,如果元素 j 恰好紧跟在元素 i 后面,则将元素 i 从容器中删除后,删除操作返回指向 j 的迭代器。
如同其他操作一样,erase 操作也不会检查它的参数。程序员必须确保用作参数的迭代器或迭代器范围是有效的。
通常,程序员必须在容器中找出要删除的元素后,才使用 erase 操作。寻找一个指定元素的最简单方法是使用标准库的 find 算法。
为了使用 find 函数或其他泛型算法,在编程时,必须将 algorithm 头文件包含进来。find 函数需要一对标记查找范围的迭代器以及一个在该范围内查找的值作参数。查找完成后,该函数返回一个迭代器,它指向具有指定值的第一个元素,或超出末端的下一位置。
string searchValue("Quasimodo");
list<string>::iterator iter =
find(slist.begin(), slist.end(), searchValue);
if (iter != slist.end())
slist.erase(iter);
注意, 在删除元素之前, 必须确保迭代器是不是 end 迭代器。使用 erase 操作删除单个必须确保元素确实存在——如果删除指向超出末端的下一位置的迭代器,那么 erase 操作的行为未定义。
删除容器内所有元素
要删除容器内所有的元素,可以调用 clear 函数,或将 begin 和 end 迭代器传递给 erase 函数。
slist.clear(); // delete all the elements within the container
slist.erase(slist.begin(), slist.end()); // equivalent
erase 函数的迭代器对版本提供了删除一部分元素的功能:
// delete range of elements between two values
list<string>::iterator elem1, elem2;
// elem1 refers to val1
elem1 = find(slist.begin(), slist.end(), val1);
// elem2 refers to the first occurrence of val2 after val1
elem2 = find(elem1, slist.end(), val2);
// erase range from val1 up to but not including val2
slist.erase(elem1, elem2);
这段代码首先调用了 find 函数两次,以获得指向特定元素的两个迭代器。迭代器 elem1 指向第一个具有 val1 值的元素,如果容器 list 中不存在值为val1 的元素,则该迭代器指向超出末端的下一位置。如果在 val1 元素后面存在值为 val2 的元素,那么迭代器 elem2 就指向这段范围内第一个具有 val2值的元素,否则,elem2 就是一个超出末端的迭代器。最后,调用 erase 函数删除从迭代器 elem1 开始一直到 elem2 之间的所有元素,但不包括 elem2 指向的元素。
erase、pop_front 和 pop_back 函数使指向被删除元素的所有迭代器失效。对于 vector 容器,指向删除点后面的元素的迭代器通常也会失效。而对于 deque 容器,如果删除时不包含第一个元素或最后一个元素,那么该 deque 容器相关的所有迭代器都会失效。

浙公网安备 33010602011771号