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

C++ int数组转vector<int>无可行转换及段错误问题咨询

报错1:类型转换失败(No Viable Conversion)
  • 含义:函数声明的返回值类型为vector<int>,你实际返回了长度为2的int原生数组,C++不支持这两种类型的隐式转换。
  • 触发原因:std::vector是STL提供的容器类,封装了动态内存管理、长度记录等功能;原生数组本质是指向内存空间的指针,无额外封装信息,二者属于完全不同的数据类型,不存在默认转换规则,因此返回数组会触发类型不匹配报错。
报错2:段错误(Segmentation Fault)
  • 含义:程序尝试访问了未被分配权限的内存地址,属于内存访问越界错误。
  • 触发原因:你声明的vector<int> scores;是一个空vector,初始长度为0,没有分配任何存储元素的内存空间。后续直接通过scores[0]、scores[1]对下标位置赋值,属于访问vector未申请的内存区域,触发越界访问导致段错误。
代码修复说明

另外你原有逻辑存在隐藏错误:当a[i]与b[i]相等时,按照题目规则双方都不得分,但你原有代码的else分支会把相等情况判定为sB得分,会导致结果不符合要求。

提供两种正确写法:

写法1:初始化时指定vector长度

vector<int> compareTriplets(vector<int> a, vector<int> b) {
    int sA = 0, sB = 0;
    // 初始化长度为2的vector,提前分配内存
    vector<int> scores(2);
    for(int i = 0; i < 3; i++){
        if (a[i] > b[i]){
            sA++;
        } else if (a[i] < b[i]) {
            sB++;
        }
        // 相等情况无操作,双方均不加分
    }
    scores[0] = sA;
    scores[1] = sB;
    return scores;
}

写法2:用push_back动态添加元素

vector<int> compareTriplets(vector<int> a, vector<int> b) {
    int sA = 0, sB = 0;
    vector<int> scores;
    for(int i = 0; i < 3; i++){
        if (a[i] > b[i]){
            sA++;
        } else if (a[i] < b[i]) {
            sB++;
        }
    }
    // 动态追加元素,vector会自动申请内存扩容
    scores.push_back(sA);
    scores.push_back(sB);
    return scores;
}
相关知识学习渠道
  • C++标准文档STL容器章节,重点掌握std::vector的初始化、元素访问、常用方法的使用规则
  • 高校C++专业课程的内存管理、STL容器相关章节
  • C经典教程《C Primer》的序列容器、数组相关章节

内容的提问来源于stack exchange,提问作者Horia Duna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:27:00