在这种情况下,如何返回true或false给for_each

How to return true or false to for_each in this case?

本文关键字:false true for each 返回 这种情况下 何返回      更新时间:2023-10-16

在我的代码下面,我想通知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;
}

解决方案是:不使用std::for_each。使用以下任意选项(根据实际情况选择):

  • std::find
  • std::find_if
  • std::find_first_of

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

std::set将自动处理重复的元素。也就是说,您可以这样做:

m_widgetSet.insert(pi);

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