[英]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
代替G
, nbvectors
代替V
, nblines
代替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.