繁体   English   中英

指向C ++中的向量数组并将其发送给函数

[英]Pointer to an array of vectors in c++ and send it to a function

我想在C ++中定义向量数组。 通常我可以这样:

vector <pair<int,int> > G[100];

我有一个从文件读取数据的功能。

我的第一个问题是,我想用从文件读取的大小V来定义G ,而G应该在main中定义,但是用未初始化的指针调用函数是行不通的。

我的第二个问题是当我这样定义G时:

vector <pair<int, int> > *G;
G = new vector <pair<int, int>>[10];  

它无法正确读取数据(无法正常工作)。

这是我的代码:

void readData(vector <pair<int, int> > *G)
{
    int V, E;
    ifstream file("input.txt");
    file >> V >> E;
    //G = new vector <pair<int, int>>[V]; //my problem
    for (int i = 0; i < E; i++)
    { 
        int u, v, w;
        file >> u >> v >> w; 
        G[u - 1].push_back(make_pair(v - 1, w)); 
        G[v - 1].push_back(make_pair(u - 1, w)); 
    }
    file.close();
}
int main() {
    vector <pair<int, int> > *G;
    G = new vector <pair<int, int>>[10]; // my problem
    MST = new vector <pair<int, int>>;
    readData(G);
}

示例数据:

5 6
1 3 4
1 2 3
2 4 6
4 3 5
4 5 20
5 2 21

并且此代码正常工作并从控制台读取数据:

const int N=10;
vector <pair<int,int> > G[N];
int main() {    
    cin >> V>>E;
    for(int i=0; i<E; i++){
        int u,v,w;
        cin >>u>>v>>w; 
        G[u-1].push_back(make_pair(v-1,w)); 
        G[v-1].push_back(make_pair(u-1,w)); 
    }
}

当使用向量完全符合您的要求时,没有理由使用内置数组 例如,您可以这样做:

void readData(std::vector<std::vector<std::pair<int, int>>>& G)
{
    std::size_t V, E;
    std::ifstream file("input.txt");
    file >> V >> E;
    //G = new vector <pair<int, int>>[V]; //my problem
    G.resize(V); // solved!!!
    for (std::size_t i = 0; i < E; i++)
    {
        std::size_t u, v, w;
        file >> u >> v >> w;
        G[u - 1].push_back(std::make_pair(v - 1, w));
        G[v - 1].push_back(std::make_pair(u - 1, w));
    }
    file.close();
}
int main() {
    std::vector<std::vector<std::pair<int, int>>> G;
//    G = new vector <pair<int, int>>[10]; // my problem
//    MST = new vector <pair<int, int>>;
    readData(G);
}

您可能应该使用一个或多个向量,而不是向量的原始数组。

例:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

void readData(vector<vector <pair<int, int>>> & G)
{
  int V, E;
  ifstream file("input.txt");

  file >> V >> E;
  G.resize(V);

  for (int i = 0; i < E; i++)
  {
    int u, v, w;
    file >> u >> v >> w;
    G[u - 1].push_back(make_pair(v - 1, w));
    G[v - 1].push_back(make_pair(u - 1, w));
  }
  file.close();
}

int main() {
  vector<vector <pair<int, int>>> G;
  readData(G);

  for (auto & v1 : G)
  {
    for (auto & p : v1)
    {
      cout << p.first << ", " << p.second << "\n";
    }

    cout << "\n";
  }
}

输出:

2, 4
1, 3

0, 3
3, 6
4, 21

0, 4
3, 5

1, 6
2, 5
4, 20

3, 20
1, 21

提示:

  • 不要使用所有大写的变量名,而要使用有意义的变量名,例如: data代替Gnbvectors代替Vnblines代替E等。
  • using namespace std; 这不是很好的做法,但是我没有对OP的代码进行太多更改。

我的第一个问题是,我想用从文件读取的大小V来定义G,而G应该在main中定义,但是用未初始化的指针调用函数是行不通的。

您不需要定义G的大小。可以简单地声明向量并使用push_back函数添加对,如下面的代码所示。

vector <pair<int, int>> G;
while (readFile) {
    G.push_back(make_pair(item1, item2));
}

我的第一个问题是,我想用从文件读取的大小V来定义G,而G应该在main中定义,但是用未初始化的指针调用函数是行不通的。

快速而肮脏的修复 :将引用传递给指针:

void readData(vector <pair<int, int> >*& G)

然后您的主要人员可以这样做:

vector<pair<int, int>>* MST;
readData(MST);

然后readData可以(并将)更改指针值(因为您通过引用传递了它)。

更好的方法:不要使用裸C数组。 使用vector

void readData(vector<vector<pair<int, int>>>& G)
{
    size_t V, E;
    ifstream file("input.txt");
    file >> V >> E;
    G.resize(V);

    // Your code...
}

main()
{
    vector<vector<pair<int, int>>> MST;
    readData(MST);
}

//G = new vector <pair<int, int>>[V]; //my problem

那不是真正的问题。 问题在于您的函数采用vector <pair<int, int> > *G并且您在上面的行中覆盖了该指针的值 如果您的函数采用一个int并且您将其覆盖,则会发生相同的情况:在两种情况下,该函数的调用者都看不到更改。

void foo(int x) {
  x = 10; // Caller will not see this change.
}

解决方法与上述相同:改为传递参考。

您可以重写函数以返回向量:

vector <pair<int, int> >* readData()
{
    int V, E;
    ifstream file("input.txt");
    file >> V >> E;
    vector <pair<int, int> > *G = new vector <pair<int, int>>[V];
    for (int i = 0; i < E; i++)
    { 
        int u, v, w;
        file >> u >> v >> w; 
        G[u - 1].push_back(make_pair(v - 1, w)); 
        G[v - 1].push_back(make_pair(u - 1, w)); 
    }
    file.close();
    return G;
}
int main() {
    MST = new vector <pair<int, int>>;
    vector <pair<int, int> > *G = readGraph();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM