一对向量的大小

Size of a vector of pairs

本文关键字:向量      更新时间:2023-10-16

我正在填充一个向量的邻接表,其对由:

vector<pair<int, int>> adj[1000];

我正在做一个深度第一搜索列表,但遇到一些奇怪的行为。第一个print语句打印一些值,这意味着我在adj[s][0], adj[s][1], adj[s][2]中有一些项,以此类推。然而,当我在下一行计算adj[s]的大小时,它打印出来的结果是零。我错过什么了吗?我对向量对的定义是正确的吗?邻接表是正确填充的,因为当我在dfs中运行cout << adj[s][0].first << endl;时,它正确地显示了每个节点的邻居。

完整代码

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <utility>
#include <climits>
#include <algorithm>
using namespace std;
vector<pair<int, int>> adj[1000];
bool visited[1000];
int nodeweight[1000];
void initialize()
    {
    for(int i = 0; i < 1000; i++)
        visited[i] = false;
    for(int i=0; i < 1000; i++)
        adj[i].clear();
    for(int i = 0; i <1000; i++)
        nodeweight[i] = INT_MAX;
}
void dfs(int s)
    {
    visited[s] = true;
    cout << adj[s][1].first << endl;
    int minimum = INT_MAX, tovisit = 0;
    for(int i = 0; i < adj[s].size(); i++)
        {
        cout << adj[s][i].second;
        if(!visited[adj[s][i].first] && adj[s][i].second < minimum)
            {
            minimum = adj[s][i].second;
            tovisit = adj[s][i].first;
        }
    }
    nodeweight[tovisit] = minimum;
    //dfs(tovisit);
}
int main() {
    int N, E;
    cin >> N >> E;
    while(E--)
        {
        int i, j, w;
        cin >> i >> j >> w;
        adj[i].push_back(make_pair(j,w));
        adj[j].push_back(make_pair(i,w));
    }
    initialize();
    for(int i = 1; i <= N; i++)
        {
        dfs(i);
    }
    return 0;
}

填写完initialize()后再次清空adj

首先在mainwhile循环中填充adj。然后调用initialize(),它包括这个循环,清除其中所有的向量:

for(int i=0; i < 1000; i++)
    adj[i].clear();

然后你在dfs中有cout << adj[s][1].first << endl;,这是未定义的行为,因为adj[s]中没有元素。事实上,你似乎得到正确的结果只是巧合的未定义的行为(虽然实际是因为保存向量数据的内存没有被清除。)

adj[s].size()被正确地报告为0