Vector: wywolanie konstruktora i przypisanie

0

Witam chcialbym z tych 2 linijek zrobic jedna, tak aby nie wykorzystywac zmiennej pomocniczy

// w Klasie skladowa:  vector < vector <float> > tab; 
 vector< vector<float> > pomocniczy ( m.w, vector<float>( m.k, m.domyslna ) );
    m.tab = pomocniczy;

Reszta kodu:

 
istream &operator>>(istream & strumien, Matrix & m)
{
    cout <<"Podaj liczbe wierszy:   ", strumien >> m.w;
    cout <<"Podaj liczbe kolumn:    ", strumien >> m.k;
    cout <<"Podaj wartosc domyslna: ", strumien >> m.domyslna;

    vector< vector<float> > pomocniczy ( m.w, vector<float>( m.k, m.domyslna ) );
    m.tab = pomocniczy;
    return strumien;
}

Dziekuje za radę.
Pozdrawiam!

0
m.tab = vector<vector<float>>( ... );

ponazywaj zmienne sensownie, a nie jakieś m i w.

0

Niby możesz tak:

m.tab = vector<vector<float>>(m.w, vector<float>(m.k, m.domyslna));

tylko nie wiem czy gra jest warta świeczki, bo to wygląda strasznie nieczytelnie.
A obecny kod też jest do poprawy tak jak @Azarien sugeruje.

1

Użyj następującego szablonu


template <typename T>
using matrix2d = std::vector<std::vector<T>>;

a następnie w operatorze >>


istream &operator>>(istream & strumien, matrix2d<float> &matrix)
{
  // ...
  matrix = matrix2d<float>( rows , vector<float>( column, deafult_value ) );
}

2

to może tak?

m.tab.resize(m.w, vector<float>(m.k, m.domyslna));
3
darthachill napisał(a):

Witam chcialbym z tych 2 linijek zrobic jedna, tak aby nie wykorzystywac zmiennej pomocniczy

// w Klasie skladowa:  vector < vector <float> > tab; 
 vector< vector<float> > pomocniczy ( m.w, vector<float>( m.k, m.domyslna ) );
    m.tab = pomocniczy;

Reszta kodu:

 
istream &operator>>(istream & strumien, Matrix & m)
{
    cout <<"Podaj liczbe wierszy:   ", strumien >> m.w;
    cout <<"Podaj liczbe kolumn:    ", strumien >> m.k;
    cout <<"Podaj wartosc domyslna: ", strumien >> m.domyslna;

    vector< vector<float> > pomocniczy ( m.w, vector<float>( m.k, m.domyslna ) );
    m.tab = pomocniczy;
    return strumien;
}

Dziekuje za radę.
Pozdrawiam!

Tak się nie definicje operatorów strumieni!
Co jeśli strumien nie jest konsolą, ale czymś innym? Plikiem, napisem (stringstream) albo połączeniem sieciowym (np POCO)?

Ten operator mógłby wyglądać tak:

istream &operator>>(istream & strumien, Matrix & m)
{
    int wiersze, kolumny, wartosc;
    if (strumien >> wiersze >> kolumny >> wartosc) {
        m.w = wiersze;
        m.k = kolumny;
        vector<float> domyslnyWiersz(kolumny, wartosc);
        m.tab = vector< vector<float> >(wiersze, domyslnyWiersz);
    }
    return strumien;
}

Ale i tak moim zdaniem sama funkcjonalność tego operatora jest zła.
Ja bym oczekiwał od takiego operatora wczytania dowolnej macierzy gdzie wartości macierzy są podawane.

O wiele bardziej logicznie jest zdefiniować jakąś funkcję, która zapewni tą funkcjonalność. Ja bym nawet nie robił tego w oparciu o strumienie. Tylo coś w tym stylu:

void Matrix::RestetTo(int rowCount, int columnCount, float defaultValue)

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