Указатель на массив векторов в c ++ и отправка его функции - PullRequest
0 голосов
/ 15 октября 2018

Я хочу определить массив векторов в c ++.Обычно я могу сделать это так:

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

У меня есть функция, которая читает данные из файла.

Моя первая проблема заключается в том, что я хочу определить G с размером V, который читает из файла, а 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)); 
    }
}

Ответы [ 5 ]

0 голосов
/ 15 октября 2018

Вы, вероятно, должны использовать вектор или векторы вместо необработанного массива векторов.

Пример:

#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; не очень хорошая практика, но я не слишком изменил код ОП.
0 голосов
/ 15 октября 2018

Моя первая проблема заключается в том, что я хочу определить G с размером V, который читает из файла, а G должен определять в основном, но вызов функции с неинициализированным указателем не может работать.

Быстрое и грязное исправление : Передайте ссылку на указатель:

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

Тогда ваш главный может сделать это:

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

Затем readData Cand(и будет) изменить значение указателя (потому что вы передали его по ссылке).

Лучший способ: Не использовать голые 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.
}

Исправление такое же, каквыше: вместо этого передайте ссылку.

0 голосов
/ 15 октября 2018

Вы можете переписать вашу функцию так, чтобы она возвращала вектор:

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();
}
0 голосов
/ 15 октября 2018

Нет смысла использовать встроенный массив , когда vector делает именно то, что вы хотите.Например, вы можете сделать это:

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);
}
0 голосов
/ 15 октября 2018

Моя первая проблема заключается в том, что я хочу определить G с размером V, который читает из файла, а G должен определять в основном, но вызов функции с неинициализированным указателем не может работать.

Вам не нужно определять размер G. Можно просто объявить вектор и добавить свои пары, используя функцию push_back, как показано в коде ниже.

vector <pair<int, int>> G;
while (readFile) {
    G.push_back(make_pair(item1, item2));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...