13

我有一个std::map,我想迭代它,从第二个条目开始。

我可以很好地解决这个问题,但我对为什么“明显”的语法无法编译感到困惑。错误消息没有帮助,因为它指的是std::string,我在这里没有使用。

这是一些代码

// Suppose I have some map ...
std::map<int, int> pSomeMap;

// This is fine ...
std::map<int, int>::const_iterator pIterOne = pSomeMap.begin();
++pIterOne;

// This doesn't compile ...
std::map<int, int>::const_iterator pIterTwo = pSomeMap.begin() + 1;

Visual Studio 2012 在上面的行中给出了以下错误:

error C2784: 'std::_String_iterator<_Mystr> std::operator +
(_String_iterator<_Mystr>::difference_type,std::_String_iterator<_Mystr>)' :
could not deduce template argument for 'std::_String_iterator<_Mystr>' from 'int'

这里发生了什么事?

4

2 回答 2

22

std::map<T>::iterator是迭代器类双向迭代器。那些只有++--运营商。+N并且[]仅适用于随机访问迭代器(可以在 eg 中找到std::vector<T>)。

这背后的原因是添加N随机访问迭代器是常数时间(例如添加N*sizeof(T)到 a T*),而为双向迭代器做同样的事情需要应用++ N时间。

你可以做的(如果你有 C++11)是:

std::map<int, int>::const_iterator pIterTwo = std::next(pSomeMap.begin(),1);

这对所有迭代器类型都是正确的。

于 2013-07-05T08:28:41.873 回答
6

std::map迭代器是双向的,因此它们只提供 ++ 和 -- 运算符,但不提供operator+,即使它是 +1。如果您确实需要模拟 operator+,则
可以使用,但这会导致迭代器调用增量序列。std::advance

于 2013-07-05T08:28:14.257 回答