首先,我使用 C ++ 98/03
我从第二个元素开始迭代我的multimap:
li
我有一个条件语句:如果当前迭代器中第一对的第一个元素等于前一个迭代器中第一个对的第一个元素,那么执行某些操作,例如。打印这些元素。
multimap<pair<string, string>, pair<string, int> >::iterator it = paths.begin();
it++;
我的问题是如何使用迭代器的副本而不是在每次(* it - )之后将其递增回来?
答案 0 :(得分:4)
创建一个类似于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++;
}
}
答案 1 :(得分:3)
只需使用另一个迭代器:
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