繁体   English   中英

当具有相同值的多个值是 std::vector 的一部分时 std::distance 的计算如何工作

[英]How calculation of std::distance works when multiple values with same value are part of the std::vector

    vector<int> arr;

    max = *max_element(begin(arr), end(arr));
    min = *min_element(begin(arr), end(arr));

    auto it = find(arr.begin(), arr.end(), max);
    auto it2 = find(arr.begin(), arr.end(), min);

    dis1 = distance(arr.begin(), it);
    dis2 = distance(arr.begin(), it2);

我想在向量中找到最大值和最小值的索引,所以我使用迭代器并使用距离方法来计算值。

这适用于某些输入,但我遇到了一个输入,其中有两个最小值。 Input : 10 10 58 31 63 40 76

所以这里 10 是最小值,但有 2 10's但我希望从最后一次出现的 10 而不是第一次计算出距离。

我可以通过持有一个变量并在 for 循环中的每次迭代中检查最小值来轻松做到这一点。

但是,我想知道我是否可以以某种方式操纵std:: distance程序将从最后一次出现的 10 开始的距离。

谢谢。

您可以为 std::max_element 和 std::min_element 提供自定义比较运算符。 使用 std::less_equal 而不是默认的 std::less 可以让您获得最后一次出现而不是第一次出现:

auto it = max_element(begin(arr), end(arr), std::less_equal<>());
auto it2 = min_element(begin(arr), end(arr), std::less_equal<>());

示例在这里

查找最后一次出现

auto it = find(arr.rbegin(), arr.rend(), max);
auto it2 = find(arr.rbegin(), arr.rend(), min);

使用反向迭代器应该做你想做的,找到最后一次出现。

dis1 = distance(arr.begin(), it.base())-1;
dis2 = distance(arr.begin(), it2.base())-1;

如果我没记错的话,否则测试:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM