2017-09-15 29 views
2

首先,我用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--)之後遞增它?

+3

'多重映射<對<字符串,字符串>,配對> ::迭代器another_iterator = it'? – NathanOliver

+0

如果你可以交換兩個輸出的順序,你可以簡單地先打印'it',然後遞增,然後再打印'it' – user463035818

回答

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 
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++; 
    } 
} 
+0

@OP你還應該考慮保護代碼,避免像'paths.size )== 1' –