如何在 C++ 中删除列表中的某些元素

Posted

技术标签:

【中文标题】如何在 C++ 中删除列表中的某些元素【英文标题】:How to remove some element in a list in C++ 【发布时间】:2017-10-30 13:52:39 【问题描述】:

我想删除列表中的一些元素,在下面的实现中,我想删除 7、14、26、77。最后打印 17、89、45、50。但似乎有问题(这个程序运行成功,但什么也没打印),谁能帮帮我?

// remove from list
#include <iostream>
#include <list>
using namespace std;
int main ()

  int myints[]= 17,89,7,14,26,77,45,50;
  std::list<int> mylist (myints,myints+8);
  std::list<int>::iterator p = mylist.begin();
  std::list<int>::iterator q = mylist.begin();
  advance(p, 2);
  advance(q, 5);

    for(p; p!=q; p++)
        mylist.remove(*p);
    

  std::cout << "mylist contains:";
  for (std::list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;

【问题讨论】:

mylist 中删除p 后,您认为p++ 应该做什么? 这个程序运行成功,但是没有打印出来 您最初向mylist 添加了多少元素? 打字错误,应该是myints+8 std::list::remove 似乎是一个奇怪的选择,你知道它的作用吗? 【参考方案1】:

std::list::remove 从列表中删除所有具有指定的元素。

std::list::erase 从列表中删除具有指定位置的元素。

您尝试使用的是擦除的范围重载:erase (iterator first, iterator last)

mylist.erase(p, q);

会如你所愿

【讨论】:

谢谢。还有一个问题,如果我把p和q都改成const_iterator,怎么用erase? @kdhug886 也一样。请参阅链接参考:“成员类型 iterator 和 const_iterator 是指向元素的双向迭代器类型。” (C++11) 但是当我改变这两行时: list::const_iterator p = mylist.begin();列表::const_iterator q = mylist.begin();出现错误:错误:没有匹配函数调用 'std::__cxx11::list::erase(std::__cxx11::list::const_iterator&, std::__cxx11::list::const_iterator&)' mylist.erase(p, q); 好吧,it works for me 你至少得有 c++11 编译器

以上是关于如何在 C++ 中删除列表中的某些元素的主要内容,如果未能解决你的问题,请参考以下文章

c++怎么删除array里面的某个元素?

在 Python 中,如何从列表中删除包含某些类型字符的任何元素?

如何删除C++循环列表中找到的最高元素旁边的元素

java swing 中的列表框JList如何在程序中动态的添加和删除元素

根据另一个列表中的条件删除一个列表中的某些元素

如何在 C 或 C++ 中以 O(n) 删除数组中的重复元素?