c ++:通过map

时间:2015-06-17 15:51:42

标签: c++ dictionary iterator

我想迭代一个地图,但内部循环只是遍历元素的上半部分。 使用矢量它看起来像:

for(auto element1 = myVector.begin() ; element1 != myVector.end() ; ++element1){
    for(auto element2 = element1 + 1; element2 != myVector.end() ; ++element2){
         //my stuff
    }
}

但是使用地图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
    }
}

3 个答案:

答案 0 :(得分:8)

您可以使用std::next执行此操作:

for(auto element1 = myMap.begin() ; element1 != myMap.end() ; ++element1) {
    for(auto element2 = std::next(element1) ; element2 != myMap.end() ; ++element2) {
        //my stuff
    }
}

以下是有关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;
}

可以像这样等效地实现:

template<class ForwardIterator>
ForwardIterator next(ForwardIterator i, int distance) {
    std::advance(i, distance);
    return i;
}

答案 1 :(得分:0)

最简单的解决方案是跳过第一个:

for(auto element1 = myMap.begin() ; element1 != myMap.end() ; ++element1){
    for(auto element2 = element1; element2 != myMap.end() ; ++element2){
         if( element2 == element1 ) continue;
         //my stuff
    }
}

答案 2 :(得分:0)

即使您不了解一些较新的C ++工具,如std::next()(这是解决此问题的好方法),这似乎是一个需要解决的基本问题:

for(auto element1 = myMap.begin() ; element1 != myMap.end() ; ++element1){
    auto element2 = element1;
    ++element2;
    for(; element2 != myMap.end() ; ++element2){
         //my stuff
    }
}