为什么我不能做std :: map.begin()+ 1?

问题描述 投票:8回答:2

我有一个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'

这里发生了什么事?

c++ visual-c++ visual-studio-2012 stl
2个回答
14
投票

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

这背后的原因是将N添加到随机访问迭代器是恒定时间(例如将N*sizeof(T)添加到T*),而对双向迭代器执行相同的操作则需要应用++ N次。

你能做什么(如果你有C ++ 11)是:

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

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


6
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.