Как найти конкретный объект в контейнере STL - PullRequest
0 голосов
/ 04 февраля 2011

Я хочу найти конкретный объект в std :: list, где атрибут объекта встречает входной аргумент.

Я нашел решение, используя унарный предикат с find (.) Или find_if (.), Нов мне нужна двоичная функция.

Почему я не могу просто позволить итератору быть ссылкой на объект (например, Java) и проверять поле через ссылку?Есть ли способ сделать это без использования find / find_if ...

Ответы [ 2 ]

8 голосов
/ 04 февраля 2011

Я нашел решение, используя унарный предикат с 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 голосов
/ 04 февраля 2011

Да, вы можете сделать это:

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

Но, конечно, я не понимаю, зачем вам нужен двоичный предикат, если вы просто проверяете один объект за раз.

...