Вариант 1
Звучит так, будто вам нужна карта отдельных элементов, а не карта пар. Используйте std::set<T>
, который является адаптером, реализованным как std::map<T,void>
. Это означает, что все ваши элементы будут уникальными; то есть в вашем контейнере не будет дубликатов. Это также подразумевает, что ваши элементы не будут строго упорядочены; то есть вы не можете полагаться на положение какого-либо элемента в любой момент времени. Затем вы можете использовать find()
функцию-член std::set<T>
, которая будет выполнять быстрый поиск элемента в логарифмическом времени.
Вариант 2
Если вам нужен контейнер, обеспечивающий быстрый доступ к наименьшему или наибольшему элементу, тогда вы можете использовать std::priority_queue<T,C>
с контейнером C
на ваш выбор. Если не указан, используемый контейнер по умолчанию - std::vector<T>
. std::priority_queue<T>
использует алгоритмы make_heap()
, push_heap()
и pop_heap()
и, следовательно, требует, чтобы базовый контейнер поддерживал итераторы с произвольным доступом; std::list<T>
будет недостаточно в этом случае. Доступ к «первому» (наибольшему или наименьшему) элементу за постоянное время с помощью функции-члена top()
. Нажмите и вытолкните первый элемент с помощью функций-членов push()
и pop()
, которые работают в логарифмическом времени (на самом деле 2 * log (n), потому что они должны искать, а также всплывать).
Вариант 3
Если вам нужен просто список, содержащий пары, просто объявите его так:
std::list<std::pair<T> > the_list;
Это не даст ничего, кроме связанного списка с ограничениями и преимуществами любого другого связанного списка, но будет содержать пары, как карта. Таким образом, вы будете использовать стандартные алгоритмы для управления списком. Возможно, вам потребуется передать специализированные функции или функторы в алгоритмы с этим списком, чтобы разыменовать ключ или значение из пары.
Если все, что вам нужно, это искать элемент в списке, не заботясь об эффективности, вы можете сделать это с помощью алгоритма std::find()
за O (n) время. Это именно то, для чего предназначен этот алгоритм, чтобы обеспечить функциональность линейного поиска по времени для любого контейнера, который не может быть лучше, чем этот. Это то, что мы используем с несортированными массивами или векторами, со списками и т. Д. Это должно быть вашим последним средством, потому что это может быть намного медленнее, чем альтернативы, хотя и замедлять само по себе. Используйте этот подход, если вы не часто выполняете поиск, если знаете, что элемент находится рядом с первым итератором, если контейнер мал, когда нет более быстрых альтернатив и т. Д.