减少std :: map的结尾

时间:2017-10-09 06:40:45

标签: c++ stl

这是我的代码:

#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;

我不知道为什么我会收到此错误,因为我认为所有类型的迭代器都允许进行算术运算。

2 个答案:

答案 0 :(得分:41)

并非所有迭代器类别都支持算术运算,这是一种误解。如果您打算编写更多通用代码,可以使用std::prev

it = std::prev(myMap.end());

它需要一个双向迭代器,std::map的迭代器是。如果要将迭代器移动多个步骤,它还可以接受指定移动迭代器的距离的第二个参数。

此外,当你传递一个随机访问迭代器时,它将与算术一样快。

答案 1 :(得分:17)

我建议您阅读不同的iterator categories,了解可用的操作。

更具体地说,std::map迭代器是bidirectional iterator,没有二进制减法。