c++问题 list随机删除如何实现?

发布网友 发布时间:2022-04-21 00:08

我来回答

2个回答

热心网友 时间:2023-07-25 01:10

list的删除,要么是remove(按照某个值)删除;要么是erase,但要通过iterator(迭代器);不需要手动修改前后两个位置的连接(list本身的实现就是一种双向链表,STL已作了操作的考量)

下面是一个完整的例子:

#include <iostream>
#include <list>

using namespace std;

int main(int argc, char** argv) 
{
    list<int> mylist;
    list<int>::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); // 这里是关键!
}
...

热心网友 时间:2023-07-25 01:10

因为List是有顺序的,所以本身没办法随机删除,所有可以先生成一个随机数,之后删除固定位置的值,以下是删除位置“i”处的代码举例:
list<int> nlist(30);
list<int>::iterator pnlist = nlist.begin();
advance(pnlisr,i);//迭代器前进i个元素,注意i是从0开始
if(pnlisr!=nlist.end())//最后一个不能删除
nlist.erase(pnlisr);//删除第i个元素
其实advance这个辅助函数,对你的迭代器的复杂度是O(N),和使用++操作符步进i次在效率上没有什么区别,只是代码上方便一些。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com