Wie behält eine Matrix ihr Value nachdem sie eine if Schleife verlassen hat?
-
Ich möchte gern mit den Werten innerhalb einer Matrix rechnen. Das aber nur wenn der benutzer vorher 'm' eingibt. Problem: sobald die if Schleife verlassen wurde bezieht sich meine Ausgabe auf keine Matrix mehr. Was muss ich tun?
#include <iostream> #include <vector> void matrix(std::vector<std::vector<int> >& my_vec, const int n, const int m) { for (int row=0; row<n; ++row) { for (int col=0; col<m; ++col) { int inputs; std::cin >> inputs; my_vec.at(row).at(col) = inputs; }} return; } int main () { int n ; int m; char v_or_m_one; std::cin>>v_or_m_one; if(v_or_m_one == 'm') { std::cin>>n>>m; std::vector<std::vector<int> > my_vec (n, std::vector<int>(m, 0)); matrix(my_vec, n, m); } std::cout<<my_vec.at(0).at(0) }
-
Es gibt keine if Schleifen.
Zieh halt die Variablendeklaration aus dem if raus.
-
Wie? So gehts auch nicht
#include <iostream> #include <vector> void matrix(std::vector<std::vector<int> >& my_vec, const int n, const int m) { for (int row=0; row<n; ++row) { for (int col=0; col<m; ++col) { int inputs; std::cin >> inputs; my_vec.at(row).at(col) = inputs; }} return; } int main () { int n ; int m; std::vector<std::vector<int> > my_vec; char v_or_m_one; std::cin>>v_or_m_one; if(v_or_m_one == 'm') { std::cin>>n>>m; my_vec (n, std::vector<int>(m, 0)); matrix(my_vec, n, m); } std::cout<<my_vec.at(0).at(0); }
-
Dieser Beitrag wurde gelöscht!
-
-
@mathelatte sagte in Wie behält eine Matrix ihr Value nachdem sie eine if Schleife verlassen hat?:
my_vec (n, std::vector<int>(m, 0));
Das ist jetzt nicht ganz trivial zu erklären, weil dir Grundlagen fehlen. Diese Zeile musst du auf jeden Fall vor das if schreiben. Das geht aber nicht direkt, weil du das m und n noch nicht eingelesen hast. Also musst du die Matrix ohne Größenangaben deklarieren, und später resizen.
-
@mathelatte sagte in Wie behält eine Matrix ihr Value nachdem sie eine if Schleife verlassen hat?:
std::vector<std::vector<int> >
Das tut ja in den Augen weh!!
-
@Swordfish Als jemand der schon länger kein C++ mehr gecodet hat und nur zufällig wieder über das Forum gestolpert ist: Kannst du mir erklären wie man es besser macht?
-
Du kannst einen Vector
width * height
anlegen und dann mitx * height + y
indexieren.
-
@Pikkolini Man kann seit C++11
std::vector<std::vector<int>>
stattstd::vector<std::vector<int> >
schreiben
-
@eigenartig sagte in Wie behält eine Matrix ihr Value nachdem sie eine if Schleife verlassen hat?:
x * height + y
Ja, nee. In C und Verwandten ist Row-Major üblich. https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays
-
@Swordfish sagte in Wie behält eine Matrix ihr Value nachdem sie eine if Schleife verlassen hat?:
Ja, nee. In C und Verwandten ist Row-Major üblich.
Ich würde das nicht unbedingt an der Sprache, sondern eher daran festmachen, was sich für das hauptsächliche Anwendungsgebiet am besten eignet. Wenn man die Matrizen z.B. hauptsächlich an eine Bibliothek weiterreicht, die eine bestimmte Elemetreihenfolge bevorzugt, dan bietet sich an, die selbe Reihenfolge zu wählen, damit man nicht jedes Mal transponieren muss. Eigen wäre ein Beispiel für so eine Bibliothek, die zwar mit beiden Ordnungen umgehen kann, aber per Default Column-Major verwendet.
Wenn ich freie Wahl hätte, würde ich übrigens ebenfalls Column-Major wählen, da für mich intuitiv mathematische Vektoren erstmal Spaltenvektoren sind, also eine -Matrix. Diese Richtung würde ich auch in einer beliebigen Matrix gerne mit
i++
abschreiten können.Letztendlich dürfte es aber meist egal sein, die Algorithmen auf denen sehen halt nur etwas anders aus (gespiegelt) und man sollte die Reihenfolge tunlichst nicht durcheinanderwerfen, wenn man keinen Müll berechnen will