Anstatt ein Array so zu erstellen, wie Sie es versucht haben, können Sie eine Klassenvorlage erstellen, die ein matrixartiges Objekt für Sie erstellt. Hier ist, was ich mir ausgedacht habe, jetzt passt das gesamte Design oder Muster dieser Vorlage zu Ihrem Zustand, aber die tatsächliche Implementierung, um die interne Matrix zu generieren, wird von Ihren Daten und Ihrer Absicht abhängen.
#include <vector>
#include <iostream>
#include <conio.h>
template <class T, class U>
class Matrix {
private:
std::vector<T> m_lines;
std::vector<T> m_cols;
std::vector<U> m_mat;
std::size_t m_size;
std::size_t m_lineCount;
std::size_t m_colsCount;
public:
Matrix() {};
Matrix(const std::vector<T>& lines, const std::vector<T>& cols) :
m_lines(lines),
m_cols(cols),
m_lineCount(lines.size()),
m_colsCount(cols.size())
{
addVectors(lines, cols);
}
void addVectors(const std::vector<T>& v1, const std::vector<T>& v2) {
m_lines = v1;
m_cols = v2;
m_lineCount = m_lines.size();
m_colsCount = m_cols.size();
for (unsigned int i = 0; i < m_lineCount; ++i) {
for (unsigned int j = 0; j < m_colsCount); j++) {
// This will depend on your implementation and how you
// construct this matrix based off of your existing containers
m_mat.push_back(m_lines[i] & m_cols[j]);
}
}
m_size = m_mat.size();
}
std::size_t size() const { return m_size; }
std::size_t sizeRows() const { return m_lineCount; }
std::size_t sizelColumns() const { return m_colsCount; }
std::vector<U>& getMatrix() const { return m_mat; }
std::vector<T>& getLines() const { return m_lines; }
std::vector<T>& getColumns() const { return m_columns; }
bool operator[](std::size_t idx) { return m_mat[idx]; }
const bool& operator[](std::size_t idx) const { return m_mat[idx]; }
};
int main() {
std::vector<unsigned> v1{ 1, 0, 1, 1, 0 };
std::vector<unsigned> v2{ 0, 1, 1, 1, 0 };
Matrix<unsigned, bool> mat1(v1, v2);
int line = 0;
for (unsigned u = 0; u < mat1.size(); ++u) {
line++;
std::cout << mat1[u] << " ";
if (line == mat1.sizeRows()) {
std::cout << "\n";
line = 0;
}
}
std::cout << "\nPress any key to quit.\n" << std::endl;
_getch();
return 0;
}
Ausgabe
0 1 1 1 0
0 0 0 0 0
0 1 1 1 0
0 1 1 1 0
0 0 0 0 0
Mit dieser Template-Klasse können Sie eine Matrix beliebigen Typs U
, indem in zwei Vektoren für T
Typen erstellen. Wie Sie die Matrix konstruieren, hängt von der Implementierung ab. Aber diese Klasse ist für verschiedene Typen wiederverwendbar.
Sie könnten zwei Vektoren vom Typ doubles haben und eine Matrix von unsignierten Zeichen konstruieren, oder Sie könnten zwei Vektoren von benutzerdefinierten Klassen- oder Strukturtypen haben und eine Matrix von vorzeichenlosen Werten erzeugen. Dies kann Ihnen in vielen Situationen helfen.
Hinweis: - Dies hat eine Compiler-Warnung generieren, wenn keine Fehler und er druckt und korrekt angezeigt, aber die Compiler-Warnung von MSVS 2015 erzeugt warnt C4800: unsigned int: forcing value to bool true or false (performance warning)
Dies ist für mich ein bisschen täte erzeugt wird weise & Operation auf vorzeichenlose Werte; Aber das ist der Grund, warum ich meine anfänglichen Vektoren so eingestellt habe, dass sie an den Konstruktor dieser Klassenvorlage übergeben werden, um alle 1s & 0s zu haben, da dies nur zur Demonstration gedacht ist.
EDIT - ich bearbeitet der Klasse gemacht, weil ich bemerkte ich einen Standardkonstruktor und hatte keine Möglichkeit, Vektoren, um es hinzuzufügen, so habe ich eine zusätzliche Membervariable und eine addVectors Funktion, und bewegt die Umsetzung vom definierten Konstruktor zur neuen Funktion und endete damit, dass diese Funktion im definierten Konstruktor aufgerufen wurde.
C++ hat keine [Arrays mit variabler Länge] (https://en.wikipedia.org/wiki/Variable-length_array), Sie müssen ['std :: vector'] verwenden (http: // en .cppreference.com/w/cpp/container/vector) (spezifischer ein Vektor von Vektoren). –
Und selbst wenn der Compiler eine Erweiterung der Sprache hat, die VLAs erlaubt (und einige haben eine solche Erweiterung, aber ich empfehle nicht, sie zu benutzen), so initialisierst du ein Array nicht. Sie * wissen * wie man ein Array initialisiert? Sie wissen, geschweifte Klammern und all das? –
Nun, ich habe gerade mit C++ begonnen, also weiß ich nicht viel von C++ ... aber ein Array kann mehrdimensional sein, oder? Und wie initialisiert man ein Array? –