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

C++二维vector push_back无法保存坐标值问题排查

错误原因

你定义的二维vector<vector<int>> shipCors初始状态是完全空的,外层vector长度为0,不存在任何索引对应的内层vector对象。此时直接通过下标shipCors[i]访问属于内存越界的未定义行为,自然无法正常执行push_back(j)存入数值,这就是坐标打印正常但无法写入vector的核心问题。

你的判断逻辑、棋盘取值逻辑都没有问题:cout能正常输出i、j坐标值,已经证明b.getSpaceValue的判断分支是正常进入的,故障点完全在vector的错误访问上。

修正方法

方案1:预分配外层vector长度(匹配你原有的存储结构)

初始化外层vector时直接指定长度为BOARDSIZE,让每个x坐标i对应的内层vector提前存在,即可正常写入:

void Game::GetShips(Board &b)
{
    // 初始化时指定外层vector长度,每个元素默认是空的vector<int>
    vector<vector<int>> shipCors(BOARDSIZE);

    for (int i = 0; i < BOARDSIZE; i++) {
        for (int j = 0; j < BOARDSIZE; j++) {
            if (b.getSpaceValue(i, j) == SHIP) {
                cout << "X :"<< i<<"\n Y:"<<j<<'\n';
                shipCors[i].push_back(j);
            }
        }
    }
    cout<< shipCors.size()<<'\n';
}

方案2:直接存储坐标对(空间利用率更高)

如果不需要按x值分组存储y坐标,更推荐直接存(x,y)坐标对,避免预分配大量空的内层vector浪费空间:

void Game::GetShips(Board &b)
{
    vector<pair<int, int>> shipCors;

    for (int i = 0; i < BOARDSIZE; i++) {
        for (int j = 0; j < BOARDSIZE; j++) {
            if (b.getSpaceValue(i, j) == SHIP) {
                cout << "X :"<< i<<"\n Y:"<<j<<'\n';
                // 直接存入成对的i、j坐标
                shipCors.emplace_back(i, j);
            }
        }
    }
    cout<< shipCors.size()<<'\n';
}

注意:C++的vector不会像部分语言的动态数组那样,通过下标访问不存在的索引时自动扩容创建元素,访问超出size()-1范围的索引一律是越界未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:18:13