Какой элемент будет возвращен из std:: multimap:: find? - программирование
Подтвердить что ты не робот

Какой элемент будет возвращен из std:: multimap:: find?

Скорее всего, этот вопрос является дубликатом, но я не мог найти ссылку на него.

Я смотрю std:: multiset:: find и std:: multimap:: find, и мне было интересно, какой элемент будет возвращен, если несколько раз был вставлен конкретный ключ?

Из описания:

Обратите внимание, что эта функция возвращает итератор в один элемент (из возможно несколько эквивалентных элементов)

Вопрос

Гарантируется ли, что одиночный элемент является первым, вставленным, или он случайный?

Фон

Причина, по которой я спрашиваю, заключается в том, что я реализую multmap как класс:

typedef std::vector<Item> Item_vector;

class Item
{
  string m_name;
};

class MyItemMultiMap
{
public:

  // forgive me for not checking if key exist in the map. it is just an example.

  void add_item( const Item& v ) { m_map[v.m_name].push_back(v); }

  // is returning the first item in the vector mimic std::multimap::find behavior?
  Item& get_item( const string& v ) { return m_map[v][0]; } 

private:
  std::map<string,Item_vector> m_map;
};

Я хотел бы, чтобы get_item() работал точно как std::multimap::find. Является ли это возможным? если да, то как это будет реализовано?

4b9b3361

Ответ 1

Метод find может возвращать произвольное, если присутствует более одного, хотя ваша реализация STL действительно может просто дать первый.

Безопаснее использовать метод "lower_bound", а ++ - итерацию (см. std:: multimap:: lower_bound). Обратите внимание, что "lower_bound" возвращает ссылку на другой элемент, если то, что вы ищете, отсутствует!

Ответ 2

В стандарте С++ сказано, что для любого ассоциативного контейнера a, a.find(k) "возвращает итератор, указывающий на элемент с ключом, эквивалентным k или a.end(), если такой элемент не найден", и он не налагает никаких дополнительных требований на multimap. Поскольку он не указывает, какой элемент возвращается, реализации разрешено возвращать любой соответствующий элемент.

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

Ответ 3

http://en.cppreference.com/w/cpp/container/multimap/find

Находит элемент с ключевым ключом. Если имеется несколько элементов с ключом в контейнере выбирается тот, который был вставлен ранее.

Итак, возвращается итератор к первому элементу.

В общем, я считаю equal_range более полезным методом, возвращая пару итераторов, указывающих соответственно на первый и после последнего, элементы, соответствующие ключу.