如何向后迭代multimap以获取唯一键?

时间:2013-03-23 21:24:16

标签: c++ iteration 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))'

2 个答案:

答案 0 :(得分: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_iterator,其结果为lower_bound作为其基础迭代器。

答案 1 :(得分:0)

您无法使用lower_boundupper_bound,因为它们会返回前进迭代器。

但编译器需要反向迭代器。转换为反转。