2012-07-16 6 views
5

voglio definire qualcosa comearray di caratteri come un valore in C++ mappa

Map<int, char[5] > myMap; 

La dichiarazione di cui sopra è accettato dal compilatore C++ e nessun errore viene generato, ma quando faccio qualcosa di simile

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

ottengo l'errore come:

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 

E 'importante per me per definire un array di caratteri di dimensioni fisse becau se ottimizza la mia operazione di streaming di rete. C'è un modo per raggiungerlo? Non voglio usare char * o std::string.

+1

Hai provato la definizione di un 'struct' che contiene un' char [5] '? – OmnipotentEntity

+0

Perché non 'char *' o meglio ancora 'string'? –

+0

@OnnipotentEntity, sì, ero in grado di farlo creando una struct :) Ma puoi spiegarmi perché ha fatto sì che una struct funzionasse e non il char [5] stesso? –

risposta

2

Un modo è quello di avvolgere la matrice di caratteri di dimensione fissa come una struttura.

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

Stai praticamente reimplementando una versione più semplice di array std/boost. Questa soluzione potrebbe essere utile se l'OP non ha accesso a C++ 11 né a boost, altrimenti non è necessario reinventare la ruota. – betabandido

+0

Come recuperare i dati? Ho usato printf ("% s \ n", myMap [0] .data), ma non funziona. – user3658306

+0

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

7

Capisco i requisiti delle prestazioni (poiché anch'io faccio cose simili), ma l'utilizzo di matrici di caratteri in questo modo è poco sicuro.

Se si ha accesso a C++ 11 è possibile utilizzare std::array. Allora si potrebbe definire la mappa come:

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

Se non è possibile utilizzare C++ 11, allora si potrebbe utilizzare boost::array.

+0

Spiacente, non posso usare la libreria boost –

+2

I due '>' dovrebbero essere separati da un carattere di spazio.Altrimenti, viene trattato come 'operatore >>'. – timrau

+7

@timrau Non più in C++ 11. Dai un'occhiata a [qui] (http://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket). – betabandido

-2

In base alla coppia documentation può contenere (ed essere definito per) classi distinte. L'array C non è una classe, ma un costrutto. È necessario definire la propria classe con sovraccarico operator[](). Potrebbe anche essere necessario disporre di operatori di confronto

+2

Hai solo bisogno di fare confronti sul 'key_type', non sul' mapped_type' –

+0

Sì, nel mio caso avevo bisogno del char array per il tipo mappato, quindi semplicemente facendo è una struttura, funziona per me. tyepdef struct { char arr [5]; } fixedArray; La struttura di cui sopra funziona per me. –

1

Non è possibile utilizzare un array in un contenitore standard.

  1. Usare un std::vector invece che una matrice

  2. usare una mappa di puntatori ad array di 5 elementi.

  3. Utilizzare boost tuples invece di matrici di 5 elementi.

  4. Invece di utilizzare una matrice, creare un nuovo struct che richiede 3 elementi. Crea il numero map<int, newstructtype>. Oppure avvolgi il tuo array in un struct e funzionerà anche tu.

\

struct ArrayMap 
{ 
    int color[5]; 
}; 

/

+0

+1 Aggiunge anche la mappa > per completarla. – Hindol