Невозможно перебрать std :: map, используя std :: string в качестве ключа - PullRequest
0 голосов
/ 26 ноября 2011

Мой вопрос почти идентичен этому , но решение там не разрешило мою ошибку.

В main.h У меня есть:

#include <map>
#include <string>

std::map<std::string, int64_t> receive_times;

И в main.cpp:

std::map<std::string, int64_t>::const_iterator iter;
std::map<std::string, int64_t>::const_iterator eiter = receive_times.end();

for (iter = receive_times.begin(); iter < eiter; ++iter)
  printf("%s: %ld\n", iter->first.c_str(), iter->second);

Однако, когда я пытаюсь скомпилировать, я получаю следующую ошибку:

error: invalid operands to binary expression ('std::map<std::string, int64_t>::const_iterator' (aka '_Rb_tree_const_iterator<value_type>') and 'std::map<std::string, int64_t>::const_iterator'
  (aka '_Rb_tree_const_iterator<value_type>'))
  for (iter = receive_times.begin(); iter < eiter; ++iter)
                                     ~~~~ ^ ~~~~~

Решение вопроса, с которым я связан в верхней части, таково:потому что там отсутствовал #include <string>, но, очевидно, я включил это.Есть намеки?

Ответы [ 2 ]

7 голосов
/ 26 ноября 2011

Итераторы не являются реляционными, только для равенства. Так сказать iter != eiter.

Менее шумный способ написания цикла:

for (std::map<std::string, int64_t>::const_iterator iter = receive_times.begin(),
     end = receive_times.end(); iter != end; ++iter)
{
  // ...
}

(обычно лучше typedef тип карты!)

Или в C ++ 11:

for (auto it = receive_times.cbegin(), end = receive_timed.cend(); it != end; ++it)

Или даже:

for (const auto & p : receive_times)
{
  // do something with p.first and p.second
}
0 голосов
/ 26 ноября 2011

Идиоматическая структура цикла для контейнерных итераторов:

for (iter = receive_times.begin(); iter != eiter; ++iter)
...