Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use an array as map value?

I'm trying to create a map, where the key is an int, and the value is an array as follows:

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

However, when I try to compile this code, I get the following error:

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<_T1, _T2>::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<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [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<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = int [3], _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int [3]> >]’: ../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 

I really can't see where the error is. Or even if there's an error.

like image 979
Tom Avatar asked Apr 06 '10 03:04

Tom


People also ask

How can use array value in map?

Use a map of pointers to arrays of 3 elements: int red[3] = {1,0,0}; int green[3] = {0,1,0}; int blue[3] = {0,0,1}; std::map<int,int(*)[3]> colours; colours. insert(std::pair<int,int(*)[3]>(GLUT_LEFT_BUTTON,&red)); colours.

How do you turn an array into a map?

To convert an array of objects to a Map , call the map() method on the array and on each iteration return an array containing the key and value. Then pass the array of key-value pairs to the Map() constructor to create the Map object.

Can we use array in map?

. map() can be used to iterate through objects in an array and, in a similar fashion to traditional arrays, modify the content of each individual object and return a new array. This modification is done based on what is returned in the callback function.

Can we store array in map in JavaScript?

Like arrays, Map objects can be cloned. Moreover, they can also be merged with arrays, if required. Hope this article will help you better your understanding of JavaScript Maps.


1 Answers

You can't copy arrays by value like that.

Here are several solutions, but I recommend #4 for your needs:

  1. Use an std::vector instead of an array.

  2. Use a map of pointers to arrays of 3 elements:

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

  4. Instead of using an array make a new struct that takes 3 elements. Make the map<int, newstructtype>. Or wrap your array in a struct as follows:

    struct Triple {     int color[3]; };  // Later in code Triple red = {1, 0, 0}, green = {0, 1, 0}, blue = {0, 0, 1}; std::map<int,Triple> colours; colours.insert(std::pair<int,Triple>(GLUT_LEFT_BUTTON,red)); colours.insert(std::pair<int,Triple>(GLUT_MIDDLE_BUTTON,blue)); colours.insert(std::pair<int,Triple>(GLUT_RIGHT_BUTTON,green)); 
like image 151
Brian R. Bondy Avatar answered Oct 14 '22 05:10

Brian R. Bondy