effective stl 第32条:如果确实需要删除元素,则需要在remove之后调用erase
2016-09-25 21:43
232 查看
remove并不是真正意义上删除,因为它做不到。remove不知道所操作的元素在哪个容器中,如果不知道,remove就不可能调用它的成员函数。
看下边的代码
把“不用被删除”的元素放在v和v.begin()和newEnd之间,把“需要被删除”的元素放在newEnd()和v.end()之间,这看起来很符合逻辑,情况不是这样的!要被删除的元素就不应该再留在v中。remove并没改变区间中元素的顺序,它只是使用要被删除的元素放在尾部,不用被删除的元素放在前边。尽管C++标准并没有强调,但一般情况下在新的逻辑结尾后边的元素仍然保留其旧的值。
但是在list的成员函数中,remove的功能与其余标准序列容器的remove-erase功能相同,按照理论上来说,list的remove也应该被称为erase,但是在关联容器中类似的函数仍然被叫做erase。
remove和remove_if的相似性是很显然的;但是unique也和remove行为也很相似。它也需要在没有任何容器信息的情况下,从容器中删除一些元素(相邻的,重复的)。所以,如果你真的想从容器中删除元素,就必须在调用erase之后再调用erase。unique与list的结合也与remove的情形相似。如同list::remove会真正删除元素,list::unique也会真正的删除元素。
#include<iostream> #include<algorithm> #include<vector> using namespace std; int main() { //因为从容器中删除元素的方法是调用该容器的成员函数,而remove不可能从容器中删除,所以 //用remove从容器中删除元素,容器中元素的数目不会减少 vector<int> v; v.reserve(10); for (int i = 1; i <= 10; i++) { v.push_back(i); } cout << v.size() << endl;//输出为10 v[3] = v[5] = v[9] = 99; remove(v.begin(), v.end(), 99);//删除值为99的元素 cout << v.size() << endl;//输出依然为10 for (vector<int>::iterator it = v.begin(); it != v.end(); it++) { cout << *it << endl; } return 0; }
看下边的代码
vector<int>::iterator newEnd(remove(v.begin(), v.end(), 99));
把“不用被删除”的元素放在v和v.begin()和newEnd之间,把“需要被删除”的元素放在newEnd()和v.end()之间,这看起来很符合逻辑,情况不是这样的!要被删除的元素就不应该再留在v中。remove并没改变区间中元素的顺序,它只是使用要被删除的元素放在尾部,不用被删除的元素放在前边。尽管C++标准并没有强调,但一般情况下在新的逻辑结尾后边的元素仍然保留其旧的值。
v.erase(remove(v.begin(), v.end(), 99),v.end());//真正删除所有值等于99的元素
但是在list的成员函数中,remove的功能与其余标准序列容器的remove-erase功能相同,按照理论上来说,list的remove也应该被称为erase,但是在关联容器中类似的函数仍然被叫做erase。
list<int> li; li.remove(99);
remove和remove_if的相似性是很显然的;但是unique也和remove行为也很相似。它也需要在没有任何容器信息的情况下,从容器中删除一些元素(相邻的,重复的)。所以,如果你真的想从容器中删除元素,就必须在调用erase之后再调用erase。unique与list的结合也与remove的情形相似。如同list::remove会真正删除元素,list::unique也会真正的删除元素。
相关文章推荐
- effective stl:如果确实需要删除元素,则需要在remove这一类算法之后调用erase
- vector::erase方法,返回值是更新后的容器的被删除元素的后一个元素的迭代器,如果需要指向删除元素的前面一个元素的迭代器就要-1
- erase-remove删除容器元素
- ArrayList中remove()方法删除长度大于5的元素之后下标重定位的问题
- stl 关于erase,remove,元素删除
- vector用erase删除元素时,被删元素的析构函数会被调用很多次
- 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式,如果并发操作,需要对 Iterator 对象加锁
- vector删除元素之pop_back(),erase(),remove()
- vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?
- STL容器中元素的删除erase()、remove()
- vector用erase删除元素时,为什么被删元素的析构函数会被调用多次?
- 为什么vector的remove_if实际上并没有删除元素,而要配合erase使用
- vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?
- erase() 返回的是删除此元素之后的下一个元素的迭代器 .xml
- erase() 返回的是删除此元素之后的下一个元素的迭代器
- list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作
- iOS-开启arc之后 NSNotificationCenter removeObserver 是否需要调用
- c语言:【顺序表】静态顺序表的删除指定位置元素Erase、删除指定元素Remove
- 开启arc之后 NSNotificationCenter removeObserver 是否需要调用?
- vector用erase删除元素时,为什么被删元素的析构函数会被调用更多次?