multmap equal_range в C++

Этот пример для использования equal_range предлагается на сайте cplusplus.com:

 int main ()
 {
   std::multimap<char,int> mymm;

   mymm.insert(std::pair<char,int>('a',10));
   mymm.insert(std::pair<char,int>('b',20));
   mymm.insert(std::pair<char,int>('b',30));
   mymm.insert(std::pair<char,int>('b',40));
   mymm.insert(std::pair<char,int>('c',50));
   mymm.insert(std::pair<char,int>('c',60));
   mymm.insert(std::pair<char,int>('d',60));

   std::cout << "mymm contains:\n";
   for (char ch='a'; ch<='d'; ch++)
   {
      std::pair <std::multimap<char,int>::iterator, std::multimap<char,int>::iterator> ret;
      ret = mymm.equal_range(ch);
      std::cout << ch << " =>";
      for (std::multimap<char,int>::iterator it=ret.first; it!=ret.second; ++it)
         std::cout << ' ' << it->second;
      std::cout << '\n';
   }

И результат называется:

mymm contains:
a => 10
b => 20 30 40
c => 50 60
d => 60

Но разве это не так? Для 'd', например, условие it!=ret.second немедленно потерпит неудачу и цикл никогда не будет выполнен? Или я неправильно понял? (Это важно, так как я основал некоторый код на этом примере и, на второй взгляд, думаю, что он может плохо себя вести.)

2 ответа

Решение

Второй итератор в диапазоне - это "один за другим" того места, где он будет таким же, как mymm.end() работает. Если mymm.begin() а также mymm.end() так же нет ничего в контейнере. Вот, ret.first а также ret.second то же самое означает, что в результирующем диапазоне нет элемента. Поскольку есть один элемент для "д", ret.first указывает на этот элемент и ret.second такой же как mymm.end(),

Нет, это не так. В соответствии с

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

с http://en.cppreference.com/w/cpp/container/multimap/equal_range это работает как положено.

Другие вопросы по тегам