2012-07-16 19 views
5

quiero definir algo comomatriz de caracteres como un valor en el mapa C++

Map<int, char[5] > myMap; 

La declaración anterior es aceptado por el compilador de C++ y no hay error se lanza, pero cuando hago algo como esto

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

me sale error como:

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 importante para mí definir una matriz de caracteres de tamaño fijo becau se optimiza la operación de mi red de flujo. ¿Hay alguna forma de lograrlo? No quiero usar char * o std::string.

+1

¿Usted ha intentado definir un 'struct' que contiene un' char [5] '? – OmnipotentEntity

+0

¿Por qué no 'char *' o mejor aún 'string'? –

+0

@OmnipotentEntity, sí, pude hacerlo convirtiéndolo en una estructura :) Pero, ¿pueden explicarme por qué fue un trabajo estructural y no el mismo [5]? –

Respuesta

2

Una forma es envolver la matriz de caracteres de tamaño fijo como una estructura.

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

Básicamente está reimplementando una versión más simple de la matriz std/boost. Esta solución podría ser útil si el OP no tiene acceso a C++ 11 ni aumenta, de lo contrario no es necesario reinventar la rueda. – betabandido

+0

¿Cómo recuperar los datos? Usé printf ("% s \ n", myMap [0] .data), pero no funciona. – user3658306

+0

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

7

Entiendo sus requisitos de rendimiento (ya que también hago cosas similares), pero el uso de matrices de caracteres de esa manera es bastante inseguro.

Si tiene acceso a C++ 11 puede usar std::array. Posteriormente, se podría definir su mapa como:

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

Si no puede utilizar C++ 11, entonces se podría utilizar boost::array.

+0

Disculpe, no puedo usar la biblioteca de impulso –

+2

Los dos '>' deben estar separados por un carácter de espacio.De lo contrario, se trata como 'operador >>'. – timrau

+7

@timrau Ya no en C++ 11. Eche un vistazo a [aquí] (http://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket). – betabandido

-2

Según documentation par puede contener (y definirse para) clases distintas. C array no es una clase, sino una construcción. Debe definir su propia clase con operator[]() sobrecargado. Es posible que también necesite operadores de comparación

+2

Solo tiene que hacer comparaciones en 'key_type', no en' mapped_type' –

+0

Sí, en mi caso necesitaba la matriz char para el tipo mapeado, por lo tanto simplemente haciendo comparaciones es una estructura, funciona para mí. tyepdef struct { char arr [5]; } fixedArray; La estructura anterior funciona para mí. –

1

No puede usar una matriz en un contenedor estándar.

  1. Utilice un std::vector lugar de una matriz

  2. Usar un mapa de punteros a las matrices de 5 elementos.

  3. Use boost tuples en lugar de matrices de 5 elementos.

  4. En lugar de usar una matriz, cree una nueva struct que tome 3 elementos. Haga el map<int, newstructtype>. O envuelva su matriz en un struct y eso también funcionará.

\

struct ArrayMap 
{ 
    int color[5]; 
}; 

/

+0

+1 También agregue map > para completarlo. – Hindol

Cuestiones relacionadas