注意:这个问题仅与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
...但我确实指定了初始化列表,不是吗?为什么这不起作用?
答案 0 :(得分:5)
类型GLfloat[3]
作为值类型,不符合关联容器的以下要求。
EmplaceConstructible
。CopyInsertable
。CopyAssignable
。更多详细信息,请访问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查找要查找的元素。我想这会更快。