访问Multiset元素C ++时出错

时间:2015-09-17 10:42:44

标签: c++ compiler-errors set multiset

我收到错误

../src/internet-stack/mp-tcp-socket-impl.cc: In member function ‘void ns3::MpTcpSocketImpl::OpenCWND(uint8_t, uint32_t)’:
../src/internet-stack/mp-tcp-socket-impl.cc:2471: error: no match for ‘operator-’ in ‘sFlow->ns3::MpTcpSubFlow::measuredRTT.std::multiset<_Key, _Compare, _Alloc>::end [with _Key = double, _Compare = std::less<double>, _Alloc = std::allocator<double>]() - 1’
/usr/include/c++/4.4/bits/stl_bvector.h:179: note: candidates are: ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)

因为我试过了:

  double maxrttval = *(sFlow->measuredRTT.end() - 1);

现在,使用相同的代码double baserttval = *(sFlow->measuredRTT.begin()); 效果很好。

我无法理解错误。我必须像访问第一个元素一样访问最后一个元素。谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

multiset的迭代器类别为BidirectionalIterator,不支持operator+也不支持operator-,它们仅受RandomAccessIterator支持。但它支持operator--,因此您可以:

double maxrttval = *(sFlow->measuredRTT.end()--);

你也可以通过反向迭代器得到最后一个元素:

double maxrttval = *(sFlow->measuredRTT.rbegin());

答案 1 :(得分:0)

如果要访问多重集的最后一项,请使用std::multiset::rbegin()

  

返回反向迭代器以反向开始返回反向   迭代器指向容器中的最后一个元素(即,它的   反向开始)。

     

反向迭代器向后迭代:增加它们会移动它们   朝着容器的开头。

     

rbegin指向将被指向的元素之前的元素   成员结束。

所以使用

double maxrttval = *(sFlow->measuredRTT.rbegin());

答案 2 :(得分:0)

为什么不使用std :: advance?

it = sFlow->measuredRTT.end();
std::advance(it, -1);
double maxrttval = *it;