gpt4 book ai didi

c++ - 为什么我不能执行 std::map.begin() + 1?

转载 作者:可可西里 更新时间:2023-11-01 16:27:39 30 4
gpt4 key购买 nike

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

这里发生了什么?

最佳答案

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

它为所有迭代器类型做正确的事情。

关于c++ - 为什么我不能执行 std::map.begin() + 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17484354/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com