2011-02-03 74 views
0

我想在std :: list中找到特定对象,其中对象的属性符合输入参数。如何在STL容器中查找特定对象

我发现一个解决方案使用find(。)或find_if(。)一元谓词,但我需要一个二元函数。

为什么我不能让迭代器作为对象的引用(如java)并通过引用检查字段?有没有办法做到这一点不使用find/find_if ...

+1

您正在使用哪种编译器?如果它是最近的GCC或VC版本,它将实现(下一版C++标准的)lambda函数,这使得这更容易。 – sbi 2011-02-03 21:34:42

回答

8

我发现一个解决方案使用find(。)或find_if(。)一元谓词,但在我需要一个二元函数。

不 - 你需要一元谓词 - 毕竟find_if功能只能一个对象(当前对象列表中的)进行比较。你的断言需要知道哪个属性值来比较:

struct compare_with { 
    int attr_value; 
    compare_with(int attr_value) : attr_value(attr_value) { } 

    bool operator()(your_object const& obj) const { return obj.attr == attr_value; } 
}; 

现在你可以调用find_if

result = find_if(your_list.begin(), your_list.end(), compare_with(some_value)); 

为什么我不能只是让迭代器是对象的引用(像java),并通过参考检查领域?

你可以。但是,这绝对不清楚你的意思。只需遍历列表。

2

是的,你可以这样做:

list<myclass>::iterator i; 
for(i = mylist.begin(); i != mylist.end(); ++i) 
{ 
    if(i->field == value_to_check_for) 
     break; 
} 

// now i is an iterator pointing to the object if it was found 
// or mylist.end() if it wasn't 

但当然,我不明白你为什么会需要一个二元谓词如果您一次只检查一个对象。