【发布时间】:2020-12-31 20:09:25
【问题描述】:
我正在尝试找到std::set 的中位数。由于std::set 已经对所有内容进行了排序,我只需要选择中间元素。我的想法是推进到一半:std::advance(e, rtspUrls.size() / 2);,但我不确定它会如何表现。像1.5 这样的数字呢?它会前进吗?
我正在使用 try catch 来尝试不进入未定义的内容。这安全吗?
根据http://www.cplusplus.com/reference/algorithm/min_element/?kw=min_element,如果迭代器抛出,std::advance 就会抛出。我不确定当我们尝试++ 时,std::set 的迭代器是否会抛出(https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator 什么也没说)。
std::set<RTSPUrl, decltype(compare_rtsp_url)*> rtspUrls(compare_rtsp_url);
std::set<RTSPUrl, decltype(compare_rtsp_url)*>::iterator e = rtspUrls.begin();
for (const RTSPUrl &rtspUrl : stream.rtsp_urls())
{
if (rtspUrl.has_resolution())
{
rtspUrls.push_back(rtspUrl);
}
}
try
{
std::advance(e, rtspUrls.size() / 2);
return *e;
}
catch (std::exception &e)
{
return std::nullopt;
}
【问题讨论】:
-
您需要检查元素的数量是偶数还是奇数,因为这将决定 median 是多少 Median - wikipedia
标签: c++