如何访问并更新C++中std::pair<int, int>的元素值
如何访问
std::pair<int, int>中的坐标值 std::pair没有重载数组下标[]运算符,不能用类似数组的写法访问内部元素,它的两个存储值通过公开成员变量直接访问:
.first:获取pair中存储的第一个元素,对应你场景里的行坐标row.second:获取pair中存储的第二个元素,对应你场景里的列坐标col
现有代码需要修正的问题
getRobotLocation存在严重未定义行为:当输入的机器人名称不存在时,robots.find()会返回robots.end()迭代器,你打印完提示信息后仍然执行return location->second,属于访问非法迭代器,会直接导致程序崩溃。建议找不到机器人时直接抛出异常,或者返回{-1,-1}这类非法坐标做错误标记。getRobotLocation调用语法错误:如果move是World类的成员函数,直接调用getRobotLocation(robot)即可,不需要重复写返回值类型加类名限定;如果是类外函数,需要通过World类的实例调用该方法。- 方向偏移逻辑存在笔误:你注释里U和D两个方向的偏移都写了
col+1,属于重复定义,需要根据自己的地图坐标系规则核对正确的行、列偏移量。 - 局部变量修改不会生效:你现在拿到的
robot_location是存储在robots容器中坐标的局部副本,修改完这个局部变量后,必须把新坐标写回robots容器,否则机器人位置不会真的更新。 - 缺少边界校验:移动前需要判断新坐标是否超出地图范围、是否落在障碍物位置,避免非法访问地图数组。
修正后的参考代码
先修正getRobotLocation的错误逻辑:
std::pair<int, int> World::getRobotLocation(char robot_name){ auto location = robots.find(robot_name); if (location == robots.end()) { std::cout << "Robot " << robot_name << " does not exist." << std::endl; // 找不到返回非法坐标 return {-1, -1}; } return location->second; }
再实现move函数的坐标更新逻辑(方向偏移按常规地图坐标系修正,你可以根据自己的规则调整对应关系):
// 假设move是World类的成员函数 std::string World::move(char robot, char direction) { // 获取机器人当前位置 std::pair<int, int> robot_location = getRobotLocation(robot); // 先判断坐标是否合法 if (robot_location.first == -1 && robot_location.second == -1) { return "Robot not exist"; } int new_row = robot_location.first; int new_col = robot_location.second; // 按方向计算新坐标:L列-1、R列+1、U行-1、D行+1 switch(direction) { case 'L': new_col -= 1; break; case 'R': new_col += 1; break; case 'U': new_row -= 1; break; case 'D': new_row += 1; break; default: return "Invalid direction"; } // 此处添加边界校验:判断new_row、new_col是否在地图合法范围内,是否碰撞障碍物 // 参考判断逻辑:if (new_row <0 || new_row >= map_rows || new_col <0 || new_col >= map_cols) {return "Move out of bound";} // 更新robots容器里存储的机器人位置 robots[robot] = {new_row, new_col}; // 如果需要同步更新map_上的机器人标记,可在此处操作 return "Move success"; }
内容的提问来源于stack exchange,提问作者mchd
相关产品推荐
相关产品推荐

