Dwuwymiarowa tablica - vector

0

Cześć,

Potrzebuję pomocy przy tworzenie dwuwymiarowej tablicy dynamicznej opartej o vector.

Napisałem "coś takiego":

 
	int x = 20;
	int y = 30;
	vector< vector<char> > mapa(x, vector<char>(y));
	fill(mapa.begin(), mapa.end(), 0);
	for (auto i = 0; i < mapa.size(); i++)
	{
		for (auto j = 0; j < mapa.size(); j++)
			cout << mapa[i][j] << ' ';
		cout << endl;
	}

Chciałbym wypełnić tą tablicę znakami (char). Jak to zrobić? (Jak skorzystać z fill, bo obecnie nie działa?)
Dlaczego, gdy dla 'y' ustawię wartość mniejszą niż dla 'x' otrzymuję błąs Expression: vector subscript out of range? Załóżmy, że ustawiam x=20 i y=15. Jak sprawdziłem mapa.size ma wartość 20, rozumiem że wychodzę poza zakres. Jak rozwiązać ten problem, aby tego uniknąć?

Pozdrawiam,
PH

0

Jak chcesz wypełnić przy tworzeniu obiektu wystarczy tak, nie trzeba filla:

	vector < vector<int> > v (5, vector<int> (4,1)); //5w, 4k, wartosci 1

EDIT: jeśli chcesz użyć fill to pamiętaj, że to jest wektor zawierający wektory charów (lub intów, czy czegokolwiek innego), musisz go wypełnić wektorami:

	fill(v.begin(), v.end(), vector<int>(4,8));

Co do size...no musisz jakoś pobrać rozmiar tego wewnętrznego wektora, nie ma na to siły. Albo używać for_each, java style for bądź iteratorów...

0
for (size_t i = 0; i < mapa.size(); ++i) {
        for (size_t j = 0; j < mapa.at(i).size(); ++j)
            cout << mapa.at(i).at(j) << ' ';

        cout << endl;
    }
0
int x = 20;
int y = 30;
std::vector<std::vector<char>> mapa(x, std::vector<char>(y, 'x')); // wstawi znak 'x' do każdego elementu wektora wektorów
0

Dzięki wielkie za szybką odpowiedź i pomoc!

0

Po co Ci wektor wektorów, skoro twoja mapa jest prostokątna?

#include <vector>

template<typename T>
struct Matrix{
    Matrix(size_t width, size_t height):
        _width(width),
        _height(height),
        _data(width*height){}

    auto width() const{ return _width; }

    auto height() const{ return _height; }

    auto *operator[](size_t idx){ return _data.data() + (idx * _height); }
    const auto *operator[](size_t idx) const{ return _data.data() + (idx * _height); }

    auto begin(){ return ::begin(_data); }
    auto begin() const{ return ::begin(_data); }

    auto end(){ return ::end(_data); }
    auto end() const{ return ::end(_data); }
private:
    size_t _width, _height;
    std::vector<T> _data;
};

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