首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从STL列表中删除项目

从STL列表中删除项目
EN

Stack Overflow用户
提问于 2009-02-02 01:15:18
回答 4查看 14.8K关注 0票数 19

我想做一个函数,如果项目符合某个条件,就把它们从一个STL列表移动到另一个列表。

这段代码不是做这件事的方法。迭代器很可能会被erase()函数失效,并导致问题:

代码语言:javascript
复制
for(std::list<MyClass>::iterator it = myList.begin(); it != myList.end(); it++)
{
  if(myCondition(*it))
  {
    myOtherList.push_back(*it);
    myList.erase(it);
  }
}

那么,有没有人能推荐一种更好的方法呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-02 01:22:24

Erase returns an iterator指向被擦除的元素之后的元素:

代码语言:javascript
复制
std::list<MyClass>::iterator it = myList.begin();
while (it != myList.end())
{
  if(myCondition(*it))
  {
    myOtherList.push_back(*it);
    it = myList.erase(it);
  }
  else
  {
    ++it;
  }
}
票数 34
EN

Stack Overflow用户

发布于 2009-03-05 14:00:38

代码语言:javascript
复制
std::list<MyClass>::iterator endMatching =
    partition(myList.begin(), myList.end(), myCondition);
myOtherList.splice(myOtherList.begin(), myList, endMatching, myList.end());

请注意,partition()为您提供了足够的能力来区分匹配对象和非匹配对象。(list::splice()很便宜)

在一个受Now to remove elements that match a predicate?启发的具体案例中,请参阅以下代码

代码语言:javascript
复制
#include <iostream>
#include <iterator>
#include <list>
#include <string>
#include <algorithm>
#include <functional>

using namespace std;

class CPred : public unary_function<string, bool>
{
public:
        CPred(const string& arString)
                :mString(arString)
        {
        }

        bool operator()(const string& arString) const
        {
                return (arString.find(mString) == std::string::npos);
        }
private:
        string mString;
};

int main()
{
        list<string> Strings;

        Strings.push_back("213");
        Strings.push_back("145");
        Strings.push_back("ABC");
        Strings.push_back("167");
        Strings.push_back("DEF");

        cout << "Original list" << endl;
        copy(Strings.begin(), Strings.end(),ostream_iterator<string>(cout,"\n"));

        CPred Pred("1");

        // Linear. Exactly last - first applications of pred, and at most (last - first)/2 swaps. 
        list<string>::iterator end1 =
        partition(Strings.begin(), Strings.end(), Pred);

        list<string> NotMatching;

        // This function is constant time. 
        NotMatching.splice(NotMatching.begin(),Strings, Strings.begin(), end1); 

        cout << "Elements matching with 1" << endl;
        copy(Strings.begin(), Strings.end(), ostream_iterator<string>(cout,"\n"));

        cout << "Elements not matching with 1" << endl;
        copy(NotMatching.begin(), NotMatching.end(), ostream_iterator<string>(cout,"\n"));

        return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2009-02-02 01:19:55

另一次尝试:

代码语言:javascript
复制
for(std::list<MyClass>::iterator it = myList.begin(); it != myList.end; ) {
    std::list<MyClass>::iterator eraseiter = it;
    ++it;
    if(myCondition(*eraseiter)) {
        myOtherList.push_back(*eraseiter);
        myList.erase(eraseiter);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/501962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档