2011-08-04 64 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」的使用通常是可疑的(僅僅因爲人們似乎只知道列表...)。 –

相關問題