Поиск определенного значения в std :: map

Возможные дубликаты:
Checking value exist in a std::map - C++
How to traverse a stl map/vector/list/etc?

Здравствуйте

Можно ли искать конкретное 9X_cpp значение в std :: map, не зная ключа? Я 9X_cxx знаю, что могу перебирать всю карту и сравнивать 9X_c++ значения, но можно ли использовать функцию 9X_cpp из алгоритмов std?

10
1

  • Для std :: map вам нужно будет повторить итерацию. В противном случае исполь ...
4
Общее количество ответов: 4

Ответ #1

Ответ на вопрос: Поиск определенного значения в std :: map

Ну, вы можете использовать std::find_if:

int main()
{
    typedef std::map my_map;

    my_map m;
    m.insert(std::make_pair(0, "zero"));
    m.insert(std::make_pair(1, "one"));
    m.insert(std::make_pair(2, "two"));

    const std::string s("one");
    const my_map::const_iterator it = std::find_if(
        m.begin(), m.end(), boost::bind(&my_map::value_type::second, _1) == s
    );
}

Но это немного 9X_c++ лучше, чем созданный вручную цикл: он по-прежнему 9X_c++ O(n).

15
1

  • Мне потребовалось некоторое время, чтобы понять использование boost :: bind. Вот несколько указателей, если они кому-то понадобятся: [Привязка переменных-членов] (http://www.boost.org/doc/libs/1_65_1/libs/phoenix ...

Ответ #2

Ответ на вопрос: Поиск определенного значения в std :: map

Вы можете использовать Boost.Bimap, если хотите индексировать 9X_cxx значения, а также ключи. Без этого или чего-то 9X_cxx подобного это придется делать методом грубой 9X_cxx силы (=> сканировать map вручную).

Boost.Bimap 9X_cpp - это двунаправленные карты библиотека 9X_cpp для C++. С Boost.Bimap вы может создавать 9X_cxx ассоциативные контейнеры в оба типа которых 9X_cpp можно использовать как ключевые.

8
1

  • @Stas - правда, но это требует больше работы - мой обычный ответ людям, которым «не разрешено использовать Boost», - все равно загружать заголовки и аб ...

Ответ #3

Ответ на вопрос: Поиск определенного значения в std :: map

Это поможет? STL find_if

У вас должен быть какой-то 9X_cpp предикат, либо указатель на функцию, либо 9X_c++ объект с реализованным operator(). Указанный предикат 9X_cxx должен принимать только один параметр.

4
0

Ответ #4

Ответ на вопрос: Поиск определенного значения в std :: map

Есть (неудобные) способы сделать это с помощью 9X_cxx стандартных функций (например, std::find_if), но они 9X_c++ по-прежнему включают итерацию по всей карте. Boost.Bimap обеспечит 9X_cxx эффективную индексацию в обоих направлениях, и 9X_cxx вы можете пойти еще дальше с Boost.Multi-Index.

2
0