当前位置:  开发笔记 > 编程语言 > 正文

从STL列表中删除项目

如何解决《从STL列表中删除项目》经验,为你挑选了2个好方法。

我想创建一个函数,如果它们匹配某个条件,则将项目从一个STL列表移动到另一个STL列表.

这段代码不是这样做的.迭代器很可能被erase()函数无效并导致问题:

for(std::list::iterator it = myList.begin(); it != myList.end(); it++)
{
  if(myCondition(*it))
  {
    myOtherList.push_back(*it);
    myList.erase(it);
  }
}

那么有人可以提出更好的方法来做到这一点吗?



1> sth..:

Erase 返回一个指向删除后的元素的迭代器:

std::list::iterator it = myList.begin();
while (it != myList.end())
{
  if(myCondition(*it))
  {
    myOtherList.push_back(*it);
    it = myList.erase(it);
  }
  else
  {
    ++it;
  }
}


我通常使用erase(it ++)而不是依赖于erase的返回值,因为其他STL容器并不总是返回更新的迭代器.
@haggai_e:每个STL容器都返回一个更新的迭代器.另一方面,您的++技巧不能保证适用于所有迭代器.(例如,在向量中,它将无效,因此您将无法增加它)

2> bk1e..:

STL列表有一个有趣的特性:该splice()方法允许您破坏性地将元素从一个列表移动到另一个列表.

splice()以恒定时间运行,不复制元素或执行任何免费的商店分配/解除分配.请注意,两个列表必须是相同的类型,并且它们必须是单独的列表实例(而不是对同一列表的两个引用).

以下是您可以使用的示例splice():

for(std::list::iterator it = myList.begin(); it != myList.end(); ) {
    if(myCondition(*it)) {
        std::list::iterator oldIt = it++;
        myOtherList.splice(myOtherList.end(), myList, oldIt);
    } else {
        ++it;
    }
}

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有