我想迭代一个地图,但内部循环只是遍历元素的上半部分。 使用矢量它看起来像:
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
}
}
答案 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
}
}