Упрощающая операция поиска по вектору - PullRequest
0 голосов
/ 08 июня 2011

Я использую вектор для нескольких массивов в моем коде из-за требования произвольного доступа к отдельным элементам массива. Некоторые операции с пользовательским графическим интерфейсом требуют поиска в массиве (но этого недостаточно, чтобы гарантировать использование std::map), поэтому код замкнут в следующем:

if (std::find(array.begin(), array.end(), searchfor) != array.end()) { ... }

Я думаю о лучшем и более легко читаемом способе сделать это, возможно, создать метод, чтобы я мог сделать что-то вроде if (array_find(searchfor) != array.end()) или, возможно, даже расширить вектор, чтобы я мог сделать if (array.find(searchfor) != array.end()).

Я не уверен, что это лучший способ сделать это. Есть идеи?

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Используйте все, что вы предпочитаете.Я считаю, что делать функцию лучше, так как она позволяет избежать хлопот, связанных с созданием нового класса и его повсеместным использованием.Что-то вроде:

bool array_contains(searchFor)
{
    return std::find(array.begin(), array.end(), searchfor) != array.end();
}
2 голосов
/ 08 июня 2011

Вы можете найти Boost.Range , который стоит посмотреть.По сути, вы можете избавиться от вызовов начала / конца в качестве аргументов, используя вместо этого ссылку на коллекцию.

#include <boost/range/algorithm/find.hpp>
...
if (boost::find(array, searchfor) != array.end()) { ... }

Преимущество этого решения состоит в том, что в результате вы все равно получаете итератор, который часто оказывается полезным.

0 голосов
/ 08 июня 2011

Если вы не хотите переписывать всю Стандартную библиотеку для использования диапазонов в тех случаях, когда это уместно (например, в этом), и убедитесь, что все, с кем вы работаете, также делают это, тогда первый опубликованный код является лучшим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...