Wprowadzanie danych do tablicy dwuwymiarowej - program się wysypuję

0

Witam.
Mam problem z programem, który się wysypuję w chwili gdy chce wstawić jakiś element do tablicy dwuwymiarowej lub wektora dwuwymiarowego.

plik graf.h:

#include <iostream>
#include <vector>
using namespace std;


class Graf
{
private:
vector<string> miasta;
vector< vector <int> > wagi;
int **tab;


public:
Graf();
~Graf();
void Pobierz_miasta();
void Pobierz_wagi();
};
 

Plik graf.cpp

#include <iostream>
#include "graf.h"
#include <fstream>
#include <vector>
using namespace std;


Graf::Graf()
{

}

Graf::~Graf()
{
delete[] tab;
}

void Graf::Pobierz_miasta()
{
    fstream plik;
    string miasto;
    int waga;
    plik.open("dane.txt");
    while(!plik.eof())
    {
        plik >> miasto;
        bool CzyJest = false;
        for (int i=0; i<miasta.size(); i++)
        {
            if (miasto==miasta[i])
                CzyJest=true;
        }
        if(CzyJest == false)
        {
            miasta.push_back(miasto);
        }
        plik >> miasto;
        CzyJest = false;
        for (int i=0; i<miasta.size(); i++)
        {
            if (miasto==miasta[i])
                CzyJest=true;
        }
        if(CzyJest == false)
        {
            miasta.push_back(miasto);
        }
        plik >> waga;
    }
    plik.close();
    for(int i=0; i<miasta.size(); i++)
    {
        cout << miasta[i] << ", ";
    }
}

void Graf::Pobierz_wagi()
{
    fstream plik;
    string miasto1;
    string miasto2;
    int waga;
    int i,j;

    plik.open("dane.txt");
    while(!plik.eof())
    {
        i=0;
        j=0;
        plik >> miasto1;
        while(miasto1 != miasta[i])
        {
            i++;
        }
        plik >> miasto2;
        while(miasto2 != miasta[j])
        {
            j++;
        }
        plik >>waga;
        cout<< i << " " << j << " " << waga << ", ";
      wagi[i][j]=waga;
      tab = new int *[10];
      tab[i][j]=waga;
    }
    plik.close();
} 

Proszę o pomoc.

1
  tab = new int *[10];
      tab[i][j]=waga;

Tak stworzysz tylko tablice jednowymiarową wskaźników na int, więc nie możesz robić czegoś takiego

tab[i][j]=waga; 

bo się wysypie.

Tablice dwuwymiarową robi się tak.

 tab = new int *[iloscWierszy];
for( size_t i = 0; i < iloscWierszy; ++i)
     tab[i] = new int[iloscKolumn]; 

A usuwa tak

for( size_t i = 0; i < iloscWierszy; ++i)
     delete [] tab[i];
delete [] tab; 

A używa tak, że jej się nie używa chyba, że masz jasny powód i wiesz co robisz. Użyj wektora tak jak to robisz z miastami i wagami;
Nie rozumiem też czemu mieszasz tablice dynamiczne z wektorami w jednym programie.

tab 

też powinno być wektorem i zaoszczędziłbyś sobie włosów na głowie.

Następne to nie wiem czemu robisz alokacje pamięci co pętle. Dzięki temu masz wycieki pamięci i wgl tego nie rozumiem.

Jak wg Ciebie ma zadziałać to

 wagi[i][j]=waga;

skoro nigdzie nie zwiększyłeś wagi

 do odpowiednich rozmiarów? Używaj <code class="cpp">wagi.push_back(); 

Pewnie jest więcej błędów i tak ogólnie kod jest niefajny i jak nie masz go dużo to napisz go od nowa z głową.

0

Możemy pominąć tablice.
Jeśli chodzi o to:

wagi[i][j]=waga; 

to tak mi polecił znajomy i upierał się, że jest dobrze.

Zatem, nie wiem jak wprowadzić te dane do wektora dwuwymiarowego.
Wektor musi mieć długość i szerokość = wielkości wektora miasta.
Wartości będą wprowadzane tylko w wybranych komórkach(muszą posiadać z góry nadany index kolumny i wiersza).

0

Udało mi się rozwiązać problem.
W pliku nagłówkowym, w klasie deklaruje tylko ilu elementowy jest wektor:

 class Graf
{
private:
vector<string> miasta;
vector< vector <int> > wagi;


public:
Graf();
~Graf();
void Pobierz_wagi();
};

A w pliku źródłowym określam rozmiar wektora i dopiero wtedy mogę przypisać odpowiedniej komórce wartość:

 
void Graf::Pobierz_wagi()
{
    fstream plik;
    string miasto1;
    string miasto2;
    int waga;
    int i,j;
    vector< vector <int> > wagi(miasta.size(), vector<int>(miasta.size(), 0));

    plik.open("dane.txt");
    while(!plik.eof())
    {
        i=0;
        j=0;
        plik >> miasto1;
        while(miasto1 != miasta[i])
        {
            i++;
        }
        plik >> miasto2;
        while(miasto2 != miasta[j])
        {
            j++;
        }
        plik >>waga;
        wagi[i][j]=waga;
    }
    plik.close();
}

Temat uważam za zamknięty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1