You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查找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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:55:16