c++ - 与 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
.
解决方案
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;
}
}
推荐阅读
- java - 为什么当我尝试运行我的应用程序时 Eclipse 会显示多个应用程序配置?
- django - Django 在附件中发送空 PDF
- python - 使用 selenium 进行 Web 抓取 - 列表超出索引 - 问题
- javascript - 尝试在节点JS中顺序运行多个等待方法,它们是并行运行的
- flutter - 使用 Duration 的颤振倒数计时器
- matlab - 如何修复 MulticlassECOC SVM 模型代码生成中的大小不匹配错误?
- reactjs - 如何从状态中删除数据以更新 React Native 中的 FlatList?
- shell - 如何从 Jenkins Pipeline sh 脚本步骤返回 stdout 和 stderr 以及状态
- php - AWS s3 getIterator ListObjects 移动到另一台服务器后产生错误
- docker - Ubuntu 18.04 的存储库问题