如何从c ++中的列表中删除重复值?

时间:2011-02-02 17:12:01

标签: c++

我是c ++的新手并且遇到了问题。我正在使用列表来存储字符串值。 现在我想从该字符串中删除重复的值。谁能告诉我这是怎么回事。

非常感谢任何示例代码。

5 个答案:

答案 0 :(得分:14)

如果列表已排序,请使用其唯一方法。

如果列表未排序(并且您不想对其进行排序):

set<string> found;
for (list<string>::iterator x = the_list.begin(); x != the_list.end();) {
  if (!found.insert(*x).second) {
    x = the_list.erase(x);
  }
  else {
    ++x;
  }
}

避免将字符串复制到集合中:

struct less {
  template<class T>
  bool operator()(T &a, T &b) {
    return std::less<T>()(a, b);
  }
};
struct deref_less {
  template<class T>
  bool operator()(T a, T b) {
    return less()(*a, *b);
  }
};

void remove_unsorted_dupes(list<string> &the_list) {
  set<list<string>::iterator, deref_less> found;
  for (list<string>::iterator x = the_list.begin(); x != the_list.end();) {
    if (!found.insert(x).second) {
      x = the_list.erase(x);
    }
    else {
      ++x;
    }
  }
}

答案 1 :(得分:13)

使用sort后跟unique

答案 2 :(得分:7)

如果您有std::list,则可以删除重复项:

yourlist.sort();
yourlist.unique();

答案 3 :(得分:4)

使用unique()。

首先排序()列表,或唯一不会达到您的预期。

答案 4 :(得分:0)

解决方案1:

struct already_found
{
  std::set<std::string> & theSet;

  bool operator()(const std::string& s) const
  {
     return !theSet.insert(s).second;
  }
};

std::set<std::string> theSet;
the_list.remove_if( the_list.begin(), the_list.end(), already_found(theSet) );

解决方案2使用shared_ptr

struct already_found
{
  boost::shared_ptr<std::set<std::string> > theSet;
  already_found() : theSet( new boost::shared_ptr<std::set<std::string> > )
  {
  }

  bool operator()(const std::string& s) const
  {
     return !theSet->insert(s).second;
  }
};

the_list.remove_if( the_list.begin(), the_list.end(), already_found(theSet) );

这两者都有必须复制所有字符串的缺点。您可以通过存储指向字符串的指针并将它们与自定义比较进行比较来稍微优化它。