在这种情况下如何将true或false返回to_each?

时间:2011-08-04 16:45:05

标签: c++ standard-library

在下面的代码中,如果找到该项目,我想通知for_each?怎么样?

#include <list>
#include <algorithm>
#include <functional>

using namespace std;

class widget {
 public:
  widget(int id) : m_id(id) {}

private:
   int m_id;
};

class findwidget {
public:
   findwidget(widget* p) : m_widget(p) {}

   bool operator()(widget* p) const { 
      return p == m_widget ? true : false;
   }

   widget* m_widget;
};

list<widget*> m_widgetList;

void push_back(widget* pi){
   if(m_widgetList.empty()) {
      m_widgetList.push_back(pi);
   } else {
      if(!std::for_each(m_widgetList.begin(), m_widgetList.end(), findwidget(pi)))
         m_widgetList.push_back(pi);
   }
}

int main(int argc, char* argv[])
{
   widget w1(1);
   push_back(&w1);
   return 0;
}

1 个答案:

答案 0 :(得分:6)

解决方案是:不要使用std::for_each。使用以下任何一种(适合您的情况):

std::find的示例:

if(std::find(m_widgetList.begin(), m_widgetList.end(),pi) == m_widgetList.end())
     m_widgetList.push_back(pi);

请注意,如果您使用std::find,则不需要findWidget仿函数。毕竟,你只是在比较地址(即指针)。

顺便说一句,您似乎希望列表包含唯一元素,并且不希望保留重复项。如果是这样,那么你最好考虑一下:

std::set会自动处理dupilcate元素。也就是说,你可以这样做:

m_widgetSet.insert(pi);

然后如果不在其中,它会将pi插入到集合中。如果它已经包含它,insert将不会将其插入到集合中。