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
相关产品推荐
相关产品推荐

