【问题标题】:Unable to iterate over std::map using a std::string as a key无法使用 std::string 作为键迭代 std::map
【发布时间】:2025-12-18 08:10:02
【问题描述】:

我的问题与this one 几乎相同,但那里的解决方案并没有解决我的错误。

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 &lt;string&gt;,但显然我已经包含了。有什么提示吗?

【问题讨论】:

  • 你不应该在头文件中定义变量...

标签: c++ iterator stdstring stdmap


【解决方案1】:

迭代器在关系上不具有可比性,仅用于相等。所以说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
}

【讨论】:

    【解决方案2】:

    容器迭代器的惯用循环结构是:

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

    【讨论】: