2d vector oder 2d array



  • Hallo,
    ich müsste ein ascii bildchen in einem 2d Array (dynamisch) speichern....

    mein erster gedanke wäre gewesen ein zweidimensionales array zu verwenden
    char** bild;

    würde sowas aber auch mit std::vector gehn?

    wie macht man denn das?
    nagut irgendwie:
    vector<vector<char> > img;

    wie greif ich nun zum beispiel aufs zeichen an [0][0] oder sonst irgendwo zu ?
    bzw wie greif ich generell schreibend/lesend drauf zu ?

    lg



  • Bei einem verschachtelten vector denke ich sollte

    img[0][0]
    

    funktionieren.

    Aber bei einem Bild bist Du mit einem unsigned char array besser bedient.

    Gut Schuß
    VuuRWerK 😉



  • Vielleicht hilft dir ein kurzes Anwendungsbeispiel schon weiter:

    //main.cpp
    #include <iostream>
    #include <vector>
    
    int main()
    {
    	std::vector< std::vector<int> > werte;
    	// Vectoren füllen
    	for(int zeilen = 0; zeilen != 3; ++zeilen) {
    		// Vector der Integerelemente enthält hinzufügen
    		werte.push_back(std::vector<int>());
    		for(int spalten = 0; spalten != 3; ++spalten) {
    			// Über reverse_iterator auf das zuletzt hinzugefügte Element des "äußeren" Vectors zugreifen
    			// und dadurch einen Integerwert zum "inneren" Vector hinzufügen
    			werte.rbegin()->push_back(zeilen + spalten);
    		}
    	}
    	// Ausgabe aller Werte
    	// Variante 1: Indexoperator
    	std::cout << "Ausgabe per Indexoperator:" << std::endl;
    	for(std::vector< std::vector<int> >::size_type zeile = 0; zeile != werte.size(); ++zeile) {
    		for(std::vector<int>::size_type spalte = 0; spalte != werte[zeile].size(); ++spalte) {
    			std::cout << werte[zeile][spalte] << " ";
    		}
    		std::cout << std::endl;
    	}
    	// Variante 2: Iteratoren
    	std::cout << "\nAusgabe per Iteratoren:" << std::endl;
    	for(std::vector< std::vector<int> >::iterator outer = werte.begin(); outer != werte.end(); ++outer) {
    		for(std::vector<int>::iterator inner = outer->begin(); inner != outer->end(); ++inner) {
    			std::cout << *inner << " ";
    		}
    		std::cout << std::endl;
    	}
    
    	return 0;
    }
    

    Natürlich hätte man das ein oder andere typedef noch mit reinwurschteln können, aber wie gesagt es soll ja nur ein kurzes Beispiel sein :).



  • min Problem konkret:
    also data ist ein vecotr mit zeichen.
    img_data ist so deklariert uint8_t** imgdata;
    jetzt will ich eben dass das ganze von
    data auf img_data in 2d umgemappt wird
    aber irgendwie spukt er mir da das falsche zeichen dann aus.....

    sieht irgendwer den fehler?
    hier ist mein code

    /*Dynamische Array von Zeigern anlegen*/
    	img_data = new uint8_t*[width];
    
    	/*An jeden Zeiger ein Array hängen*/
    	for (int i = 0; i < width; i++) {
    		img_data[i] = new uint8_t[height];
    	}
    
    	/*pixel auf 2d ummappen*/
    	int x = 0; //x-achse
    	int y = 0; //y-achse
    	for(int k = 0; k< data.size(); k++) {
    		img_data[x][y] = data[k];
    
    		if(k % width == 0) {x++; y=0;}
    		else y++;
    	}
    	cout << img_data[0][1];
    

Anmelden zum Antworten