C ++地图中的C风格数组

时间:2014-11-29 06:25:36

标签: c++ arrays map

注意:这个问题仅与C ++中的地图和数组有关。只有这样我才能使用OpenGL,所以不应该劝阻那些没有OpenGL知识的人进一步阅读。

我试图将C风格的数组放入C ++ std::map中,以便以后在设置颜色时使用。

const map<int, GLfloat[3]> colors = { // 
    {1, {0.20. 0.60. 0.40}},          //
    ...                               // This produces an error.
    {16, {0.5, 0.25, 0.75}}           //
};                                    //

...

int key = 3;
glColor3fv(colors.at(key));

这不能编译,因为:

Semantic Issue
Array initializer must be an initializer list

...但我确实指定了初始化列表,不是吗?为什么这不起作用?

4 个答案:

答案 0 :(得分:5)

类型GLfloat[3]作为值类型,不符合关联容器的以下要求。

  1. 不是EmplaceConstructible
  2. 不是CopyInsertable
  3. 不是CopyAssignable
  4. 更多详细信息,请访问http://en.cppreference.com/w/cpp/concept/AssociativeContainer

    您可以创建一个帮助程序类来帮助您。

    struct Color
    {
       GLfloat c[3];
       GLfloat& operator[](int i) {return c[i];}
       GLfloat const& operator[](int i) const {return c[i];}
    };
    
    const std::map<int, Color> colors = {
        {1, {0.20, 0.60, 0.40}},
        {16, {0.5, 0.25, 0.75}}
    };  
    

答案 1 :(得分:2)

问题是数组既没有复制构造函数也没有复制赋值运算符。而不是C数组使用具有复制构造函数和复制赋值运算符的标准C ++容器std::array

例如

#include <iostream>
#include <array>
#include <map>

using namespace std;

int main() 
{
    const std::map<int, std::array<float,3>> colors = 
    {
        { 1, { 0.20, 0.60, 0.40 } },
        { 16, { 0.5, 0.25, 0.75 } }
    };  

    return 0;
}

为简单起见,我在示例中使用了float而不是GLfloat

答案 2 :(得分:1)

这样做:

using std;
using namespace boost::assign;

map<int, GLfloat[3]> colors  = map_list_of (1, {0.20. 0.60. 0.40}) (16, {0.5, 0.25, 0.75});

应该做的伎俩。

答案 3 :(得分:-3)

也许不会更快,缓存未命中。

使用已排序的std :: vector或array<std::pair<const Key, Value>并使用std :: lower / upper_bound查找要查找的元素。我想这会更快。