查找std::vector中相邻元素不相等的索引问题求助
问题分析与解决
你的问题出在循环逻辑中对std::adjacent_find返回值的处理,以及没有单独处理最后一个元素的索引。我们一步步拆解:
原代码的问题
std::adjacent_find传入std::not_equal_to<int>()时,返回的是第一个与下一个元素不相等的迭代器(也就是连续相同元素块的最后一个元素的迭代器)。但你的循环在adjacent_find返回std::end(v)时,仍然输出了它的距离值(也就是6,这是向量末尾的位置,不是有效索引),这就是最后一个输出错误的原因。
另外,你期望的结果包含最后一个元素的索引5,而adjacent_find无法找到与最后一个元素相邻的下一个元素,所以需要单独补充这个索引。
修正方案
我们可以调整循环逻辑,只在adjacent_find返回有效迭代器时输出索引,循环结束后再添加最后一个元素的索引:
#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> v = {1, 1, 2, 2, 2, 3}; auto i1 = std::begin(v); while (true) { // 找到第一个相邻不相等的元素对的前一个迭代器 i1 = std::adjacent_find(i1, std::end(v), std::not_equal_to<int>()); if (i1 == std::end(v)) break; // 输出当前块最后一个元素的索引 std::cout << std::distance(std::begin(v), i1) << ' '; // 移动到下一个块的起始位置 ++i1; } // 补充最后一个元素的索引 std::cout << std::distance(std::begin(v), std::end(v) - 1) << std::endl; return 0; }
另一种更直观的实现
如果你觉得用adjacent_find有点绕,也可以直接遍历向量,判断每个元素是否是当前连续块的最后一个(要么是向量最后一个元素,要么与下一个元素不相等):
#include <iostream> #include <vector> int main() { std::vector<int> v = {1, 1, 2, 2, 2, 3}; for (size_t i = 0; i < v.size(); ++i) { if (i == v.size() - 1 || v[i] != v[i+1]) { std::cout << i << ' '; } } std::cout << std::endl; return 0; }
这两种实现都会输出你期望的1 4 5。
内容的提问来源于stack exchange,提问作者Andrej Kesely
相关产品推荐
相关产品推荐

