c ++ Zugriff auf Elemente des Arrays in einer Map [Duplikat]

8

Angenommen, ich habe die folgende Datenstruktur:

%Vor%

Wie kann ich mit dem Operator [] auf seine Elemente zugreifen?

Im Wesentlichen möchte ich etwas tun wie:

%Vor%

Beim Kompilieren dieser Codezeilen erhalte ich den folgenden Fehler:

%Vor%

Kommentare?

    
arthur 23.11.2012, 10:51
quelle

3 Antworten

5

Werttypen für Maps müssen standardmäßig konstruierbar sein und einen Ausdruck value_type() verwenden, um über [] darauf zugreifen zu können. Aus irgendeinem mysteriösen Grund sind Array-Typen nicht, wie in C ++ 11 5.3.2 / 2 spezifiziert (mit meiner Betonung):

  

Der Ausdruck T (), wobei T ein einfacher Typ-Specifier oder Typname-Specifier für einen non-array complete-Objekttyp ist, ... erzeugt einen prvalue des angegebenen Typs Wert initialisiert

Der Compiler gibt diesen seltsamen Fehler beim Versuch, ein Array zu value-initialisieren. Das folgende gibt den gleichen Fehler:

%Vor%

Ich schlage vor, eine Klasse anstelle von double[2] : std::array<double,2> , std::pair<double,double> oder eine struct mit zwei Doppelpunkten zu verwenden. Solche Typen sind kopierbar, zerfallen nicht in einen Zeiger (sie verlieren ihre Kenntnisse über die Größe der Kompilierung) und sind im Allgemeinen einfacher zu handhaben als ein eingebauter Array-Typ.

Wenn Sie an einer alten Bibliothek festhalten, die std::array nicht zur Verfügung stellt, können Sie die sehr ähnliche Boost.Array , oder schreiben Sie Ihre eigene einfache Klassenvorlage, um ein Array zu umbrechen.

    
Mike Seymour 23.11.2012, 11:18
quelle
1

Dein Code kompiliert bis:

%Vor%

weil double[2] ein gültiger Typ ist. Sie können ein Vorlagenklassenobjekt mit einem beliebigen gültigen Typ deklarieren. Zum Beispiel:

%Vor%

wird ohne Probleme kompiliert.
Wenn Sie x.foo() aufrufen, wird sich der Compiler darüber beschweren.

Dasselbe passiert im Fall von std::map . Wenn Sie Funktionen wie map::insert() , map::operator [] aufrufen, bei denen der Werttyp double[2] tatsächlich verwendet wird, beginnt der Compiler mit der Reklamation, da double[2] nicht kopierbar ist ( Ausnahme : I habe eine alte Version von g ++ 3.x gesehen, wo Arrays zuweisbar und kopierbar waren).

Sie können Ihr Array in eine Struktur kapseln.

%Vor%

Wenn Sie die Verwendung von RAW-Arrays vermeiden möchten, ist std::array eine gute Option, wie in Kommentaren und anderen Antworten erwähnt.

    
iammilind 23.11.2012 11:25
quelle
1

Sie können ein Array umbrechen:

%Vor%

Live-Beispiel . Sonst, wenn Sie C ++ 11 haben, sollten Sie std::array ; Wenn nicht, und Sie Boost haben, können Sie Boost.Array verwenden.

    
Synxis 23.11.2012 11:20
quelle

Tags und Links