【问题标题】:How to return true or false to for_each in this case?在这种情况下,如何为 for_each 返回 true 或 false?
【发布时间】:2011-08-04 16:45:04
【问题描述】:

如果我找到该项目,我想在下面的代码中通知 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;
}

【问题讨论】:

    标签: c++ standard-library


    【解决方案1】:

    解决方案是:不要使用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 会自动处理重复的元素。也就是说,您可以这样做:

    m_widgetSet.insert(pi);
    

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

    【讨论】:

    • +1 for std::set(我也会考虑在 C++0x 中使用 std::unordered_set,因为订单似乎没有导入)。正确选择数据结构是基础,std::list 的使用通常是可疑的(仅仅是因为人们似乎只知道列表......)。
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2018-04-26
    • 2014-09-12
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多