声明具有特定大小的 vector<vector<pair<int、int>>?

Declaring a vector<vector<pair<int, int>> with a specific size and inserting elements?

本文关键字:lt int gt vector pair 声明      更新时间:2023-10-16

我想表示一个图形数据结构,我使用的是c++stl中成对向量的向量。示例:

vector<vector<pair<int, int>>> G;

现在我可以了,G[u].push_back(make_pair(v, w));

问题是:我需要为这个数据结构指定一个大小。如果我不这样做,当我试图将元素推送到这个数据结构时,我会遇到分段错误。如果我给出的尺寸是:

vector< vector<ii> > adj(10, std::vector<ii>(10));

现在的问题是前10对矢量被初始化为零。如果我现在推回一个元素,它就会被推到第11个位置。前10个是0。我不想这么做。我想按需要的顺序插入元素。一个片段,让你知道我正在尝试做什么:

 for(int i=0;i<E-1;i++)
        {
            cin >> p >> q >> l;
            adj[p].push_back(ii(q, l));
            adj[q].push_back(ii(p, l));
        } 

上面的输出将是10个零,后面跟着推送的值。有办法绕过这个吗?

不知何故,你在自相矛盾:创建向量时,你可以在构造函数中传递元素的数量,也可以从一个空向量开始,推送你想要在向量中包含的元素。如果你从10号开始,然后再推10号,就有20号。他们要么使用

std::vector<T> vect(10);
for (size_t i=0;i<10;i++){
    vect[i] = whatever;
}

std::vector<T> vect;
for (size_t i=0;i<10;i++){
     vect.push_back(whatever);
}

也许你混淆了向量的大小和它的容量。您可以通过以下方式进行设置:

std::vector<T> vect;
vect.reserve(10);
for (size_t i=0;i<10;i++){
     vect.push_back(whatever);
}

对于向量中的向量,在开始将元素推入索引之前,必须确保在该索引处有一个向量:

std::vector<std::vector<T>> mat;
for (size_t i=0;i<10;i++){
    mat.push_back(std::vector<T>());
    for (size_t j=0;j<10;j++){
        mat[i].push_back(whatever);
    }
}

如果您事先知道数据结构的大小,您可以使用适当的构造函数声明它:

vector<vector<pair<int,int>>> G(10);

当程序读取数据以填充该结构时,它可以检查输入的indes是否越界,也可以相应地调整向量的大小。例如这个测试程序:

#include <iostream>
#include <vector>
using std::vector;
using std::pair;
using std::cout;
using std::cin;
int main() {
    vector<vector<pair<int,int>>> G(5);
    //  insufficient initial size  ^^^
    int p, q, l;
    while ( cin >> p >> q >> l )
    {
        // resize the vector to avoid index out of bound
        int m = std::max(p, q) + 1;
        if ( m > G.size() )
            G.resize(m);
        G[p].push_back(std::make_pair(q, l));
        G[q].push_back(std::make_pair(p, l));
    } 
    for( int r = 0; r < G.size(); ++r )
    {
        for ( int c = 0; c < G[r].size(); ++c ) {
            cout << r << ", " << c << ": " << G[r][c].first << ' ' << G[r][c].second << 'n';
        }
    } 
    return 0;
}

输入类似:

1 2 3
4 5 6
7 8 9
8 7 6
5 4 3
2 1 0

给出以下输出:

1, 0: 2 3
1, 1: 2 0
2, 0: 1 3
2, 1: 1 0
4, 0: 5 6
4, 1: 5 3
5, 0: 4 6
5, 1: 4 3
7, 0: 8 9
7, 1: 8 6
8, 0: 7 9
8, 1: 7 6

分段错误是因为u >= G.size(),而不是由push_back()引起的。

您需要首先将G的大小调整为图形的顶点数量,然后,只要u < G.size() ,您就可以进行推回

更正后的代码应该是这样的:

vector< vector<ii> > adj(10 /* number of vertexes in the graph */);
for (int i=0; i < E-1; i++)
{
    cin >> p >> q >> l;
    // make sure both p < adj.size() and q < adj.size()
    adj[p].push_back(ii(q, l));
    adj[q].push_back(ii(p, l));
}