2012-07-16 10 views
5

ich so etwas wieZeichen-Array als Wert in C++ Karte

Map<int, char[5] > myMap; 

Die obige Erklärung von C++ Compiler akzeptiert definieren wollen und kein Fehler wird ausgelöst, aber wenn ich so etwas wie dieses

int main() 
{ 
    char arr[5] ="sdf"; 
    map <int, char[5]> myMap; 
    myMap.insert(pair<int, char[5]>(0,arr)); 
    return 0; 
} 

ich bekomme Fehler wie:

In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0, 
       from /usr/include/c++/4.6/bits/char_traits.h:41, 
       from /usr/include/c++/4.6/ios:41, 
       from /usr/include/c++/4.6/ostream:40, 
       from /usr/include/c++/4.6/iostream:40, 
       from charMap.cpp:1: 
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const _T1&, const _T2&) [with _T1 = int, _T2 = char [5]]’: 
charMap.cpp:9:42: instantiated from here 
/usr/include/c++/4.6/bits/stl_pair.h:104:31: error: array used as initializer 
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = int, _U2 = char [5], _T1 = const int, _T2 = char [5]]’: 
charMap.cpp:9:43: instantiated from here 
/usr/include/c++/4.6/bits/stl_pair.h:109:39: error: array used as initializer 

Es ist wichtig für mich eine feste Größe Zeichen-Array zu definieren becau Es optimiert meinen Netzwerk-Stream-Betrieb. Gibt es einen Weg, es zu erreichen? Ich möchte nicht char * oder std::string verwenden.

+1

Haben Sie versucht, die eine 'struct', die eine' char enthält [5] '? – OmnipotentEntity

+0

Warum nicht 'char *' oder besser noch 'string'? –

+0

@OmnipotentEntity, ja, ich konnte es machen, indem ich es zu einem struct mache :) Aber kannst du mir bitte erklären, warum es eine struct Arbeit gemacht hat und nicht der char [5] selbst? –

Antwort

2

Eine Möglichkeit besteht darin, das Array fester Größe als Struktur zu umbrechen.

struct FiveChar 
{ 
    FiveChar(char in[5]) { memcpy(data, in, 5); } 
    char& operator[](unsigned int idx) { return data[idx]; } 
    char data[5]; 
}; 

int main(void) 
{ 
    char arr[5] = "sdf"; 
    map<int, FiveChar> myMap; 
    myMap.insert(pair<int, FiveChar>(0, arr)); 
    return 0; 
} 
+2

Sie implementieren grundsätzlich eine einfachere Version von Std/Boost-Array. Diese Lösung kann nützlich sein, wenn das OP nicht auf C++ 11 oder Boost zugreifen kann, da sonst das Rad nicht neu erfunden werden muss. – betabandido

+0

Wie die Daten abgerufen werden? Ich habe printf ("% s \ n", myMap [0] .data) verwendet, aber es funktioniert nicht. – user3658306

+0

@ user3658306 http://ideone.com/RiyDEb – timrau

7

Ich verstehe Ihre Leistungsanforderungen (da ich ähnliche Dinge auch tun), aber die Verwendung von Zeichen-Arrays auf diese Weise ist ziemlich unsicher. Wenn Sie Zugriff auf C++ 11 haben, können Sie std::array verwenden. Dann könnten Sie Ihre Karte definieren, wie:

map <int, array<char, 5>> myMap; 

Wenn Sie nicht C++ 11 verwenden können, dann könnten Sie boost::array verwenden.

+0

Entschuldigung, ich kann Boost-Bibliothek nicht verwenden –

+2

Die zwei '>' sollten durch ein Leerzeichen getrennt werden.Ansonsten wird es als "operator >>" behandelt. – timrau

+7

@timrau Nicht mehr in C++ 11. Sehen Sie sich [hier] an (http://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket). – betabandido

-2

Nach documentation Paar halten kann (und definiert werden) verschiedene Klassen. C-Array ist keine Klasse, sondern ein Konstrukt. Sie müssen Ihre eigene Klasse mit überladenem operator[]() definieren. Könnte auch Vergleichsoperatoren benötigen

+2

Sie müssen nur Vergleiche auf dem 'key_type', nicht die' mapped_type' –

+0

Ja, in meinem Fall brauchte ich das char-Array für den zugeordneten Typ, also einfach durch Es ist eine Struktur, es funktioniert für mich. Tyepdef Struct { Zeichen arr [5]; } fixedArray; Die obige Struktur funktioniert für mich. –

1

Sie können ein Array nicht in einem Standardcontainer verwenden.

  1. Verwenden einer std::vector anstelle eines Arrays

  2. Verwendung einer Karte von Zeigern auf Arrays von 5 Elementen.

  3. Verwenden Sie boost tuples statt Arrays von 5 Elementen.

  4. Anstatt ein Array zu verwenden, machen Sie ein neues struct, das 3 Elemente benötigt. Machen Sie die map<int, newstructtype>. Oder wickeln Sie Ihr Array in eine struct und das wird auch funktionieren.

\

struct ArrayMap 
{ 
    int color[5]; 
}; 

/

+0

+1 Fügen Sie auch map > hinzu, um es zu vervollständigen. – Hindol