这是我的代码:
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int , int > myMap;
map<int , int>::iterator it;
myMap.insert(pair<int , int>(1,2));
myMap.insert(pair<int , int>(671,223));
myMap.insert(pair<int , int>(353,245352));
it = myMap.end() - 1;
cout << it->first << it->second << endl;
return 0;
}
编译此代码会产生以下编译错误:
error: no match for ‘operator-’ (operand types are ‘std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}’ and ‘int’)
it = myMap.end() - 1;
我不知道为什么我会收到此错误,因为我认为所有类型的迭代器都允许进行算术运算。
答案 0 :(得分:41)
并非所有迭代器类别都支持算术运算,这是一种误解。如果您打算编写更多通用代码,可以使用std::prev
:
it = std::prev(myMap.end());
它需要一个双向迭代器,std::map
的迭代器是。如果要将迭代器移动多个步骤,它还可以接受指定移动迭代器的距离的第二个参数。
此外,当你传递一个随机访问迭代器时,它将与算术一样快。
答案 1 :(得分:17)
我建议您阅读不同的iterator categories,了解可用的操作。
更具体地说,std::map
迭代器是bidirectional iterator,没有二进制减法。