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

C++逆序遍历两个vector查找首个共同值的实现问题

C++逆序查找两个vector首个共同元素解决方案

错误原因说明

  1. 迭代器操作违规:std::vector的end()方法返回尾后迭代器,不指向任何有效元素,直接解引用属于未定义行为,你运行得到0输出就是该问题导致的。
  2. 遍历方向错误:逆序遍历需要对普通迭代器执行自减(--)操作,你代码中的自增(++)会让迭代器向尾后越界方向移动,逻辑完全错误。
  3. 语法使用错误:第一个版本for循环中多个并列表达式需要用逗号分隔,&&是逻辑与运算符,不能用来分隔赋值语句。

正确实现

方案1:使用反向迭代器(推荐)

反向迭代器的rbegin()直接指向容器最后一个有效元素,++操作等价于普通迭代器的--,天然适配逆序遍历需求:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v1 = {32, 64, 90};
    std::vector<int> v2 = {32, 64, 78};
    
    auto it1 = v1.rbegin();
    auto it2 = v2.rbegin();
    int res;
    bool found = false;
    
    // 任意一个容器遍历完成则结束循环
    while (it1 != v1.rend() && it2 != v2.rend()) {
        if (*it1 == *it2) {
            res = *it1;
            found = true;
            break;
        }
        // 反向迭代器++对应向容器头部移动
        ++it1;
        ++it2;
    }
    
    if (found) {
        std::cout << res << std::endl; // 示例输入对应输出为64
    } else {
        std::cout << "未找到共同元素" << std::endl;
    }
    return 0;
}

方案2:使用普通迭代器

如果不想用反向迭代器,可以调整普通迭代器的操作顺序:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v1 = {32, 64, 90};
    std::vector<int> v2 = {32, 64, 78};
    
    auto it1 = v1.end();
    auto it2 = v2.end();
    int res;
    bool found = false;
    
    while (it1 != v1.begin() && it2 != v2.begin()) {
        // 先自减指向有效元素,再判断
        --it1;
        --it2;
        if (*it1 == *it2) {
            res = *it1;
            found = true;
            break;
        }
    }
    
    if (found) {
        std::cout << res << std::endl;
    } else {
        std::cout << "未找到共同元素" << std::endl;
    }
    return 0;
}

内置函数说明

C++标准库没有直接匹配该需求的内置函数,上述自定义循环的实现复杂度很低,不需要额外依赖第三方接口。

内容的提问来源于stack exchange,提问作者Kirti Purohit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:45:06