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

在pair类型二维vector中查找指定pair所在行的问题排查

解决邻接表中查找指定Pair所在行的问题

我帮你分析下代码里的问题,然后给出正确的实现方案:

你的代码存在的几个关键错误

  1. 第一个实现的内层循环笔误:
    你写的for (int j = 0; j < adj[i].size(); i++)里,循环增量是i++而不是j++——这直接导致j永远不会增加,循环要么直接跳出,要么陷入死循环,根本没法遍历当前行的元素。

  2. 外层循环条件错误:
    不管是第一个还是第二个实现,你用adj->size()作为循环上限是完全错误的。因为adj是一个固定大小的数组(vector<pair<int,int>> adj[20]),adj->size()实际上取的是adj[0]这个vector的元素数量,而不是整个邻接表的节点总数。你应该遍历实际用到的节点编号(也就是你输入时的1到nodes)。

  3. 第二个实现的返回值缺失:
    如果遍历完所有元素都没找到目标pair,你的第二个函数没有返回值,这会触发C++的未定义行为,程序可能崩溃或者返回随机值。

正确的实现代码

我们调整函数参数,传入实际的节点总数nodes,然后用更简洁的方式遍历:

typedef pair<int, int> p;

// 新增nodes参数,明确要遍历的节点范围
int which_row(vector<p> adj[20], p target_pair, int nodes) {
    // 遍历所有实际存在的节点(从1到nodes,和你输入逻辑一致)
    for (int i = 1; i <= nodes; ++i) {
        // 用范围for循环遍历当前节点的所有邻接边,简洁不易错
        for (const auto& edge : adj[i]) {
            // pair已经重载了==运算符,直接比较即可
            if (edge == target_pair) {
                return i;
            }
        }
    }
    // 没找到目标pair,返回-1表示不存在
    return -1;
}

调用示例

记得调用时要传入节点总数nodes:

p target = make_pair(6, 2);
cout << which_row(adj, target, nodes);

额外说明

如果你的节点编号是从0开始的,只需要把外层循环改成for (int i = 0; i < nodes; ++i)即可,根据实际的节点编号规则调整就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:32:34