2013-03-23 53 views
0

我知道如何向前做到這一點:如何向後迭代multimap以獲得唯一鍵?

for(auto it = mmap.begin(), end = mmap.end(); it != end; it = mmap.upper_bound(it->first)) 

但這不起作用:

for(auto it = mmap.rbegin(), end = mmap.rend(); it != end; it = mmap.lower_bound(it->first)) 

,並提供: error: no match for 'operator=' in 'it = mmap.std::multimap<_Key, _Tp, _Compare, _Alloc>::lower_bound<unsigned int, long int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, long int> > >((* & it.std::reverse_iterator<_Iterator>::operator-><std::_Rb_tree_iterator<std::pair<const unsigned int, long int> > >()->std::pair<const unsigned int, long int>::first))'

+0

你爲什麼使用'upper_bound'和'lower_bound'? – 2013-03-23 21:26:23

+0

@sftrabbit:第一行是遍歷多圖中唯一鍵的方法。 – deepmax 2013-03-23 21:28:16

+0

@MM。謝謝 - 之前沒有看到這種方法。 – 2013-03-23 21:28:44

回答

2

一個std::multimap::iterator不能直接轉化爲std::reverse_iterator。你需要做的std::lower_bound結果it基地迭代器:

typedef ... multimap_type; 
typedef std::reverse_iterator<multimap_type::iterator> reverse_iterator; 

for (auto it = mmap.rbegin(), 
      end = mmap.rend(); 
    it != end; 
    it = reverse_iterator(mmap.lower_bound(it->first))) 
{ 
    // ... 
} 

表達reverse_iterator(mmap.lower_bound(it->first))將構造一個std::reverse_iteratorlower_bound作爲其基本的迭代的結果。

+0

'錯誤:在'...'令牌之前預期的不合格id- – rsk82 2013-03-23 22:25:59

+1

@ rsk82我的意思是說要成爲一個佔位符供你填寫。它應該是你的類型多重映射。例如,'std :: multimap '。 – 2013-03-23 22:31:38

+0

@ rsk82所以它實際上工作?哈哈,我期待修復一些bug。 – 2013-03-23 22:47:30

0

您不能使用lower_boundupper_bound,因爲它們會返回轉發迭代器。

但編譯器期望反向迭代器。轉換爲反向。