首页 > 解决方案 > 与 std::map 的 reverse_iterator 上的“operator-”不匹配

问题描述

我有一个std::map,我正在尝试以有效的方式将所有条目与所有其他条目进行比较。我的想法是,我将有一个嵌套循环,其中条目的起点在当前循环之后。

我有以下代码作为我要完成的示例:

#include <iostream>
#include <string>
#include <map>

int main(int argc, char* argv[])
{
  std::map<std::string, std::string> m;
  m["one"]    = "a";
  m["two"]    = "b";
  m["three"]  = "c";
  m["four"]   = "d";
  m["five"]   = "e";
  m["six"]    = "f";
  m["seven"]  = "g";

  for (auto outerIterator = m.begin(); outerIterator != m.end(); ++outerIterator)
  {
    std::cout << outerIterator->second << std::endl;

    for (auto innerIterator = outerIterator + 1; innerIterator != m.end(); ++innerIterator)
    {
      std::cout << " > " << innerIterator->second << std::endl;
    }
  }

  return 0;
}

尝试此操作时,我收到以下错误:

error: no match for ‘operator+’ (operand types are ‘std::_Rb_tree_iterator<std::pair<const std::__cxx11::basic_string<char>, std::__cxx11::basic_string<char> > >’ and ‘int’)
    for (auto innerIterator = outerIterator + 1; innerIterator != m.end(); ++innerIterator)
                                            ^

显然,它不喜欢我尝试进入下一个条目的方式(我根据使用的工作示例进行了尝试std::vector)。是否有可能只使用std::map.

标签: c++c++11stliteratorstdmap

解决方案


std::map::iterator不是随机访问的迭代器,因此它没有operator+(int). 您可以解决该问题:

for (auto outerIterator = m.begin(); outerIterator != m.end(); )
{
    std::cout << outerIterator->second << std::endl;

    for (auto innerIterator = ++outerIterator; innerIterator != m.end(); ++innerIterator)
    {
      std::cout << " > " << innerIterator->second << std::endl;
    }
}

推荐阅读