我想在std :: list中找到一个特定对象,其中对象的属性符合输入参数。
我找到了一个使用带有find(。)或find_if(。)的一元谓词的解决方案,但我需要一个二元函数。
为什么我不能让迭代器成为对象的引用(比如java)并通过引用检查字段?有没有办法不使用find / find_if ...
答案 0 :(得分: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)并通过引用检查字段?
你可以。但是,你绝对不清楚这是什么意思。只需遍历列表即可。
答案 1 :(得分: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
但是,当然,如果您只是一次检查一个对象,我无法理解为什么您需要二元谓词。