C++ C++;:地图的迭代

C++ C++;:地图的迭代,c++,map,iterator,C++,Map,Iterator,我找不到任何解决问题的办法。让我们假设这样的地图有n个元素: std::map<string, string> tmpMap; 使用函数std::advance()。它需要一个引用,而不是返回一个新的迭代器,这是一个我从未理解的奇怪现象 您需要将迭代器增加4倍: ++itTmpMap; ++itTmpMap; ++itTmpMap; ++itTmpMap; 使用std::advance(itTmpMap,4)映射迭代器是双向迭代器,而不是随机访问迭代器。std::map的迭代器是

我找不到任何解决问题的办法。让我们假设这样的地图有n个元素:

std::map<string, string> tmpMap;

使用函数
std::advance()
。它需要一个引用,而不是返回一个新的迭代器,这是一个我从未理解的奇怪现象

您需要将迭代器增加4倍:

++itTmpMap;
++itTmpMap;
++itTmpMap;
++itTmpMap;

使用
std::advance(itTmpMap,4)映射迭代器是双向迭代器,而不是随机访问迭代器。
std::map
的迭代器是双向的。对于这样的迭代器,有几个操作是有效的,但是添加一个整数来移动它并不是其中之一。有几种方法可以做到这一点:

Compilator error: 
int a = 4;
itTmpMap = itTmpMap + a;
// this will advance the iterator 4 times
for (unsigned int i = 0; i < 4; ++i)
    itTmpMap++;

std::map
具有双向迭代器。没有为双向迭代器定义操作迭代器+整数类型。因此,要得到itTmpMap+4的等价迭代器,需要将其增加4倍。 C++标准定义了这样一个操作的特殊功能。您可以使用返回类型为void的
std::advance
。比如说

std::advance( itTmpMap, 4 );
std::next( itTmpMap, 4 );
或者可以使用
std::next
返回对源递增迭代器的引用。比如说

std::advance( itTmpMap, 4 );
std::next( itTmpMap, 4 );
例如,从您可以编写的第四个迭代器开始遍历映射

std::for_each( std::next( tmpMap.begin(), 4 ), tmpMap.end(), SomeFunction );

你找不到解决办法?有很多重复:(C++ 11有<代码> STD::下一个和 STD::Prv如果你喜欢返回值,它不是真正的“古怪”;它在适合普通用例的情况下避免拷贝。C++不给你你不需要的东西。D@LRO,AFAIK(我的知识并不广博),这是唯一通过引用(?)获取迭代器的函数