当具有相同值的多个值是 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 保持距离。
谢谢。
查找最后一次出现
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;
如果我没记错的话,否则测试:)
您可以为 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<>());
例子here
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 保持距离。
谢谢。
查找最后一次出现
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;
如果我没记错的话,否则测试:)
您可以为 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<>());
例子here