使用条件语句迭代 multimap

Iterating multimap with conditional statement

首先,我使用的是C++98/03

我正在从第二个元素开始迭代我的多图:

multimap<pair<string, string>, pair<string, int> >::iterator it = paths.begin();
it++;

我有一个条件语句:如果当前迭代器中第一对的第一个元素等于前一个迭代器中第一对的第一个元素,则执行某些操作,例如。打印这些元素。

for(; it != paths.end(); it++) {
    if((*it).first.first == (*it--).first.first ) {
        it++;
        cout << (*it).first.first << " ";
        cout << (*it--).first.first << endl;
        it++;
    }
    else {
        it++;
    }
}

我的问题是如何使用迭代器的副本而不是在每次 (*it--) 之后递增它?

创建类似于 C++11 的实用程序 std::prev:

#include <algorithm>

template <class T>
T prev(T it)
{
    std::advance(it, -1);
    return it;
}

然后使用如下:

for(; it != paths.end(); it++) {
    if((*it).first.first == prev(it)->first.first ) {
        cout << (*it).first.first << " ";
        cout << prev(it)->first.first << endl;
    }
    else {
        it++;
    }
}

只需使用另一个迭代器:

 typedef multimap<pair<string, string>, pair<string, int> >::iterator iterator;
 for( iterator it = paths.begin(); it != paths.end(); ) {
     iterator prev = it++;
     if( it == paths.end() )
         break;
     if( prev->first.first == it->first.first ) {
         // output here
     }
 }

请注意您的代码不正确,首先它有 UB,因为 == 没有排序。但是即使你在左侧使用不同的迭代器,你也会得到错误的行为:

 iterator it1 = it;
 if((*it1).first.first == (*it--).first.first ) { // not UB anymore, but result is always true as you compare the same element