2011-08-04 7 views
0

下のコードで、アイテムを見つけたらfor_eachに通知しますか?それはどうですか?この場合、for_eachにtrueまたはfalseを返す方法は?

#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を使用しないでください。 (あなたの状況に合ったものは何でも)次の中からいずれかを使用します。std::find

例:

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

(注)std::findを使用している場合、は必要ありませんファンクタ。結局のところ、アドレス(つまりポインタ)だけを比較しています。

ところで、リストにというユニークな要素が含まれ、重複しないようにしたいと思うようです。それがそうであるならば、あなたは良く考えてみます。

std::setを自動的dupilcate要素を処理します。それはあなたがこれを行うことができ、次のとおりです。

m_widgetSet.insert(pi); 

そのないことであれば、それはセットにpiを挿入します。すでにそれが含まれている場合、insertはセットに挿入されません。

+1

+1 '' std :: set'(私は 'std :: unordered_set'をC++ 0xでも考えています。なぜなら、注文はインポートされていないようだからです)。データ構造の適切な選択は基本的なものであり、 'std :: list'の使用は通常疑わしい(単に人々がリストを知っているように思えるからです...)。 –

関連する問題