Utilizzo dell’array come valore della mappa: imansible vedere l’errore

Sto provando a creare una mappa, dove la chiave è un int e il valore è una matrice

int red[3] = {1,0,0}; int green[3] = {0,1,0}; int blue[3] = {0,0,1}; std::map colours; colours.insert(std::pair(GLUT_LEFT_BUTTON,red)); //THIS IS LINE 24 ! colours.insert(std::pair(GLUT_MIDDLE_BUTTON,blue)); colours.insert(std::pair(GLUT_RIGHT_BUTTON,green)); 

Tuttavia, quando provo a compilare questo codice, ottengo il seguente errore.

 g++ (Ubuntu 4.4.1-4ubuntu8) 4.4.1 In file included from /usr/include/c++/4.4/bits/stl_algobase.h:66, from /usr/include/c++/4.4/bits/stl_tree.h:62, from /usr/include/c++/4.4/map:60, from ../src/utils.cpp:9: /usr/include/c++/4.4/bits/stl_pair.h: In constructor 'std::pair::pair(const _T1&, const _T2&) [with _T1 = int, _T2 = int [3]]': ../src/utils.cpp:24: instantiated from here /usr/include/c++/4.4/bits/stl_pair.h:84: error: array used as initializer /usr/include/c++/4.4/bits/stl_pair.h: In constructor 'std::pair::pair(const std::pair&) [with _U1 = int, _U2 = int [3], _T1 = const int, _T2 = int [3]]': ../src/utils.cpp:24: instantiated from here /usr/include/c++/4.4/bits/stl_pair.h:101: error: array used as initializer In file included from /usr/include/c++/4.4/map:61, from ../src/utils.cpp:9: /usr/include/c++/4.4/bits/stl_map.h: In member function '_Tp& std::map::operator[](const _Key&) [with _Key = int, _Tp = int [3], _Compare = std::less, _Alloc = std::allocator<std::pair >]': ../src/utils.cpp:30: instantiated from here /usr/include/c++/4.4/bits/stl_map.h:450: error: conversion from 'int' to non-scalar type 'int [3]' requested make: *** [src/utils.o] Error 1 

Non riesco davvero a vedere dove si trova l’errore. O anche se c’è un errore.

Non è ansible copiare array per valore come quello.

Qui ci sono diverse soluzioni, ma ti consiglio # 4 per le tue esigenze:

1) Usa un std::vector invece di un array

2) Usa una mappa di puntatori per matrici di 3 elementi.

 int red[3] = {1,0,0}; int green[3] = {0,1,0}; int blue[3] = {0,0,1}; std::map colours; colours.insert(std::pair(GLUT_LEFT_BUTTON,&red)); colours.insert(std::pair(GLUT_MIDDLE_BUTTON,&blue)); colours.insert(std::pair(GLUT_RIGHT_BUTTON,&green)); //Watch out for scope here, you may need to create the arrays on the heap. 

3) Usa boost tuples invece di matrici di 3 elementi.

4) Invece di usare una matrice, crea una nuova struttura che prende 3 elementi. Crea la mappa. Oppure avvolgi il tuo array in una struttura e anche questo funzionerà.

 struct Triple { int color[3]; }; //Later in code Tripple red = {1, 0, 0}, green = {0, 1, 0}, blue = {0, 0, 1}; std::map colours; colours.insert(std::pair(GLUT_LEFT_BUTTON,red)); colours.insert(std::pair(GLUT_MIDDLE_BUTTON,blue)); colours.insert(std::pair(GLUT_RIGHT_BUTTON,green)); 

Le matrici non sono costrutti di prima class in C ++. Non sono Copy ConstructibleAssignable che sono requisiti per i valori di std::map . Puoi usare boost::array o std::vector .

Usa std :: tr1 :: array .

 typedef std::tr1::array Triple; Triple red = {1, 0, 0}; Triple green = {0, 1, 0}; Triple blue = {0, 0, 1}; std::map colours; colours.insert(std::make_pair(GLUT_LEFT_BUTTON, red)); colours.insert(std::make_pair(GLUT_MIDDLE_BUTTON, blue)); colours.insert(std::make_pair(GLUT_RIGHT_BUTTON, green)); 

Non mappare su un int [], invece, mappare su un int * come questo:

 #include  #include  using namespace std; int main(){ std::map colors; int red[] = {3,7,9}; colors[52] = red; cout << colors[52][1]; //prints 7 colors[52][1] = 11; cout << colors[52][1]; //prints 11 return 0; } 

Un’altra alternativa consiste nel mettere gli array in una struttura wrapping:

  struct Wrapper { int value[3]; }; // ... Wrapper red = {{1,0,0}}; std::map colours; colours.insert(std::pair(1, red)); 

Le matrici non possono essere i dati memorizzati in un contenitore standard ( std::pair )

Approccio usando la struttura in C ++

 int MAX_DATA_PER_INSTR = 8; //struct to hold the values. remember to write the constructor struct InstrChar { InstrChar(int in[MAX_DATA_PER_INSTR]) { //c alternative is memcopy std::copy(in, in+MAX_DATA_PER_INSTR, data); } int data[MAX_DATA_PER_INSTR]; }; // create a key value pair std::map  address_instructions; std::map ::iterator it; // sample array, 8 elements int xp[MAX_DATA_PER_INSTR ] = {31,4,3,4,4,3,1,2}; address_instructions.insert(std::pair(PC, xp)); it = address_instructions.find(PC); InstrChar buf1 = it->second; //integer pointer to the array, can be dereferenced as *p, *(p+1), .... //*(p+7) int *p = buf1.data; //in case you need to print these values out. They can also be referred to as buf1.data[0], buf1.data[1], buf1.data[2] printf("%d\n", (*p)); printf("%d\n", *(p+1)); printf("%d\n", *(p+2)); printf("%d\n", *(p+3)); printf("%d\n", *(p+4)); printf("%d\n", *(p+5)); printf("%d\n", *(p+6)); printf("%d\n", *(p+7));