C++ 访问多集元素C+时出错+;

C++ 访问多集元素C+时出错+;,c++,compiler-errors,set,multiset,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::measur

我得到了错误

../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 basertval=*(sFlow->measuredtt.begin())
效果非常好

我不明白怎么了。我必须访问最后一个元素,就像访问第一个元素一样。谢谢您的帮助。

is的迭代器类别不支持
运算符+
运算符-
,它们仅受支持。但它支持
运算符--
,因此您可以:

double maxrttval = *(sFlow->measuredRTT.end()--);
您也可以通过反向迭代器获得最后一个元素:

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

如果要访问multiset的最后一项,请使用:

Return reverse iterator to reverse start返回一个反向 指向容器中最后一个元素的迭代器(即 反向开始)

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

rbegin指向将被指向的元素之前的元素 到成员端

所以使用

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

为什么不使用std::advance

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