如何在STL容器中查找特定对象

发布于 2024-10-16 02:16:56 字数 185 浏览 3 评论 0原文

我想在 std::list 中找到一个特定对象,其中该对象的属性满足输入参数。

我找到了一个使用一元谓词与 find(.) 或 find_if(.) 的解决方案,但我需要一个二元函数。

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

I want to find a specific object in a std::list where the object's attribute meets an input argument.

I found a solution using a unary predicate with find(.) or find_if(.) but in I need a binary function.

Why can't I just let the iterator be the reference of the object (like java) and check the field via the reference? Is there a way to do that without using find/find_if...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

月亮邮递员 2024-10-23 02:16:56

我找到了一个使用一元谓词与 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)并通过引用检查字段?

你可以。但绝对不清楚你的意思是什么。只需迭代列表即可。

I found a solution using a unary predicate with find(.) or find_if(.) but in I need a binary function.

No – you do need a unary predicate – after all, the find_if function only compares with one object (the current object in the list). Your predicate needs to know which attribute value to compare with:

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; }
};

Now you can invoke find_if:

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

Why can't I just let the iterator be the reference of the object (like java) and check the field via the reference?

You can. But it’s absolutely not clear what you mean by this. Just iterate over the list.

℡寂寞咖啡 2024-10-23 02:16:56

是的,你可以这样做:

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

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

Yes, you can do that:

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

But of course, I can't see why you'd need a binary predicate if you're just checking one object at a time.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文