Arc*_*yno 4 c++ dictionary iterator
我想迭代一个映射,但内部循环只是遍历元素的上半部分.使用矢量它看起来像这样:
for(auto element1 = myVector.begin() ; element1 != myVector.end() ; ++element1){
for(auto element2 = element1 + 1; element2 != myVector.end() ; ++element2){
//my stuff
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果地图element1 + 1返回错误no operator matches this operand..我相信它来自于元素未在地图中排序的事实.
那我怎么能这样做呢?我目前正在使用这种杂乱的解决方法,需要在每个循环中进行测试:
for(auto element1 = myMap.begin() ; element1 != myMap.end() ; ++element1){
for(auto element2 = element1; element2 != myMap.end() ; ++element2){
if(element->first != element2->first)
//my stuff
}
}
Run Code Online (Sandbox Code Playgroud)
你可以std::next这样做:
for(auto element1 = myMap.begin() ; element1 != myMap.end() ; ++element1) {
for(auto element2 = std::next(element1) ; element2 != myMap.end() ; ++element2) {
//my stuff
}
}
Run Code Online (Sandbox Code Playgroud)
以下是一些其他背景信息std::next.std::next有一个可选的第二个参数,它是跟随传递的迭代器的元素数.例如,std::next(element1, 2)将返回第二个元素的迭代器element1.正如评论中指出的那样,使用时必须小心std::next,特别是在循环中.如果it指向之前的元素myMap.end(),则使用std::next(it, 2)未定义行为的结果.您希望确保使用它永远不会传递容器的末尾.
您可以将其std::next视为如下所示:
// If distance is negative, then i must meet the requirements of BidirectionalIterator
// Otherwise, i must meet the requirements of ForwardIterator.
template<class ForwardIterator>
ForwardIterator next(ForwardInterator i, int distance) {
for( ; distance < 0 ; ++distance) {
--i;
}
for( ; distance > 0 ; --distance) {
++i;
}
return i;
}
Run Code Online (Sandbox Code Playgroud)
这可以像这样等效地实现:
template<class ForwardIterator>
ForwardIterator next(ForwardIterator i, int distance) {
std::advance(i, distance);
return i;
}
Run Code Online (Sandbox Code Playgroud)