2011-08-04 58 views
0

在我的代码中,如果我找到该项目,我想通知for_each?那是怎么回事?如何在这种情况下返回true或false以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; 
} 

回答

6

解决的办法是:不要使用std::for_each。从下列情况下使用任何(无论适合您的情况):

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将不会将其插入到集合中。

+1

+1对于'std :: set'(我会考虑C++ 0x中的'std :: unordered_set',因为顺序似乎没有导入)。数据结构的适当选择是最基本的,“std :: list”的使用通常是可疑的(仅仅因为人们似乎只知道列表...)。 –

相关问题