list的删除,要么是remove(按照某个值)删除;要么是erase,但要通过iterator(迭代器);不需要手动修改前后两个位置的连接(list本身的实现就是一种双向链表,STL已作了操作的考量)
下面是一个完整的例子:
#include
#include
using namespace std;
int main(int argc, char** argv)
{
listmylist;
list::iterator it;
for (int i = 1; i < 10; ++i) mylist.push_back(i*10);
cout << "delete the 5th element" << endl;
it = mylist.begin();
advance(it, 5-1); // 这里修改迭代器的位置
mylist.erase(it); // 这里删除
for (it = mylist.begin(); it != mylist.end(); ++it)
cout << ' ' << *it;
cout << "\n";
return 0;
}
结果:
delete the 5th element
10 20 30 40 60 70 80 90
需要注意的是在for循环中的删除: 应该有下面的类似代码:
...
for ( iter = mylist.begin(); iter != mylist.end(); ++iter)
{
iter = mylist.erase(iter); // 这里是关键!
}
...
因为List是有顺序的,所以本身没办法随机删除,所有可以先生成一个随机数,之后删除固定位置的值,以下是删除位置“i”处的代码举例:
list
list
advance(pnlisr,i);//迭代器前进i个元素,注意i是从0开始
if(pnlisr!=nlist.end())//最后一个不能删除
nlist.erase(pnlisr);//删除第i个元素
其实advance这个辅助函数,对你的迭代器的复杂度是O(N),和使用++操作符步进i次在效率上没有什么区别,只是代码上方便一些。