2011-01-28 91 views
1

我存儲在STD值之間的迭代::地圖STL容器:兩個迭代器

我發現在地圖上的兩個值,我想通過第一之間迭代到最後一個項目 - 但是< =運算符不落實,所以我不能做somethimng這樣的:

void foobar(const DatedRecordset& recs, const double startstamp, const double endtstamp) 
    { 
     DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp), end_iter = recs.lower_bound(endtstamp); 

     // Can't do this .... (<= not defined) 
     //for (DatedRecordsetConstIter cit = start_iter; cit <= end_iter; cit++) 

     /So have to resort to a hack like this: 
     for (DatedRecordsetConstIter cit = start_iter; cit != recs.end(); cit++) { 
      if ((*cit).first <= (*end_iter).first){ 
       //do something; 
      } 
      else 
       break; 
      } 
     } 
} 

有兩個已知的迭代器之間迭代的一個更優雅的方式?

+0

您可以使用cit!=(end_iter + 1)。 – 2011-01-28 20:35:16

+1

這不適用於`std :: map :: iterator`;它沒有定義「+」運算符。儘管假設'end_iter'不是`recs.end()`,但是使用'boost :: next`之類的東西(儘管如此,原始規範在這種情況下將是無效的)。 – 2011-01-28 20:37:46

+0

@Jeremiah Willcock:你說的對,但`++`操作符可以做'new_end_iter = end_iter ++`的技巧。 – 2011-01-28 21:05:26

回答

2

使用!=而不是<=它會做你想做的事情。

void foobar(const DatedRecordset& recs, const double startstamp, const double endtstamp) 
{ 
    DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp), 
          end_iter = recs.upper_bound(endtstamp); 

    for (DatedRecordsetConstIter cit = start_iter; cit != end_iter; ++cit) { 
    } 
} 
1

std::map<>::iterator沒有<=運算符,但使用!=end_iter應該做基本相同的事情。如果您想在迭代中包含結束迭代器本身,請使用類似於do循環的方法在最後執行!=測試。

1
struct ManipulateMatchingPairs { 
    template<class K, class V> 
    void operator()(const std::pair<K,V>& p) const { 
     // do with p.second as you please here. 
    } 
}; 

// ... 
std::for_each(start_iter, end_iter, ManipulateMatchingPairs()); 
0

的STL for_each算法也將不包括在循環結束迭代器。儘管如此,你總是可以增加end_iter,然後使用for_each,這樣它就會被包含在內。

void foobar(const DatedRecordset& recs, 
      const double startstamp, 
      const double endtstamp) 
{ 
    DatedRecordsetConstIter start_iter = recs.lower_bound(startstamp); 
    DatedRecordsetConstIter end_iter = recs.lower_bound(endtstamp); 
    if(end_iter != recs.end()) 
     ++end_iter; 

    for_each(start_iter, end_iter, []() 
     { 
      //do something inside the lambda. 
     }); 
} 

這樣的事情可能嗎?我沒有給它一個編譯檢查...

0

你必須使用!=運算符。我相信這是因爲std :: map在內存中不一定是連續的(所以<=運算符沒有太大意義,而std::vector會),但我可能是錯誤的,儘管

0

如果你想包含結束迭代器,你可以增加你的結束條件迭代器++end_iter。之後,與cit != end_iter循環的做法與您打算在增量之前使用cit <= end_iter的做法相同。