如何使用数组作为地图值?

2022-01-24 00:00:00 dictionary arrays containers c++ stdmap

我正在尝试创建一个map,其中key是一个int,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.

推荐答案

你不能像那样按值复制数组.

You can't copy arrays by value like that.

这里有几种解决方案,但我推荐 #4 以满足您的需求:

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

  1. 使用 std::vector 而不是数组.

使用指向 3 个元素的数组的指针映射:

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.

    不要使用数组,而是创建一个包含 3 个元素的新结构.制作 map.或者将您的数组包装在一个结构中,如下所示:

    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));
    

  • 相关文章