C++ 创建样例库
嘿,大家好,我正在清理上学期的代码C++ 创建样例库,c++,windows,visual-studio-2008,optimization,colors,C++,Windows,Visual Studio 2008,Optimization,Colors,嘿,大家好,我正在清理上学期的代码 以前我在C++中创建了一个151色的SabVIEW库。然而,由于时间紧迫和缺乏经验,我将其完全创建为一个define语句块。这对于将值硬编码到点很有效。然而,这种方法有一些明显的弱点 到目前为止,我所做的是创建一个名称空间“样例”,在名称空间内,我将有一个有效颜色的枚举。我还有一个“getSwatch”函数,或者类似的函数,它将返回一个vec3,一个我的类,表示一个由3个元素组成的向量,具有一些很好的功能,并且该函数将使用switch语句遍历有效的样例 它看起
以前我在C++中创建了一个151色的SabVIEW库。然而,由于时间紧迫和缺乏经验,我将其完全创建为一个define语句块。这对于将值硬编码到点很有效。然而,这种方法有一些明显的弱点
到目前为止,我所做的是创建一个名称空间“样例”,在名称空间内,我将有一个有效颜色的枚举。我还有一个“getSwatch”函数,或者类似的函数,它将返回一个vec3,一个我的类,表示一个由3个元素组成的向量,具有一些很好的功能,并且该函数将使用switch语句遍历有效的样例 它看起来像这样:namespace swatch{
enum color{
red,
blue,
green
}
inline
const vec3 getColor(const color& c){
// Switch and return red blue or green.
}
}
我的问题:我想知道你建议怎么做?性能和可用性的好处是我最感兴趣的
提前感谢各位朋友
快乐编码
编辑:我刚刚更改了示例,以便对不知道如何使用我的vec类的人更有意义。i、 e:除了我,所有人都喜欢。此外,您还可以查看其他Anwser的使用情况。他们对将rgb值传递给构造函数做了一个很好的猜测,我不是这样做的,但我仍然可以很好地理解您的意思。您可以使用:
然后你的getColor函数就是:
return colors[color];
完成了 使用查找表:
/************* .h *************/
enum color{
red,
blue,
green,
colors_count
}
const vec3 &getColor(color c)
{
extern const vec3 colors_table[colors_count];
return colors_table[c];
}
/************* .cpp *************/
extern const vec3 colors_table[colors_count] = {
vec3(255, 0, 0), // red
vec3(0, 0, 255), // blue
vec3(0, 255, 0), // green
};
你们并没有写任何关于使用模板的目的的东西,所以我只是删除了它们。如果你再多解释,也许我会帮你
//编辑
它非常简单,速度也非常快。
在C++中,枚举值不仅仅是一些标识符,它们是数字。如果不指定其他,它们将从0开始衰减数字:“红色”为0,“蓝色”为1,“绿色”为2,“颜色计数”为3请参见。
可以使用这些数字为数组编制索引。然后,您只需从给定索引的数组中选择一项。我不明白您想做什么。为什么getColor接受一种颜色,为什么它是一个模板?对不起,我会解释的。这与vec类有关。vec类接受一个模板。get color接受一种颜色,因此它可以返回表示为vec的颜色。例如:vec背景3;backgroundCol=swatch::getColorred;所以backgroundCol[0]等于1,那么backgroundCol[1]和backgroundCol[2]都等于零。假设一个RGB比例,其中每个值是0到1。好吧,先生,我喜欢这样。向颜色添加更多的关联,然后使用switch语句。然而,使用这种颜色排序的方法,我不需要一直在内存中保存每种颜色的副本吗?@Xoorath:那么你有多少种颜色?如果小于10^6,有什么问题吗?@迈克:我有151个。不一定有“问题”。然而,我将在制作视频游戏时使用它,在内存可能有限的平台上;假设每个vec有4个元素RGBA,那么我在内存中有604个浮点或双精度浮点,这时我可以使用处理能力在颜色之间切换,而不是存储数据。我只是想知道我是否能在消耗CPU功率和内存之间找到一个很好的平衡点。不过,这仍然是一个可行的选择。好吧,您无法初始化贴图,那么如果map::find没有找到颜色,您可以添加它。。。或者,您可以只给与十六进制值匹配的枚举值。@Xoorath:听起来您需要的只是一个RGBA值数组。在编译器中初始化它,因此初始化它不消耗任何代码。通过整数枚举对其进行索引。无论是在时间上还是在内存上,你都无法获得比这更高的效率。我真想知道为什么要用浮点存储每个R/G/B/A值。在没有浮点转换开销的情况下,8位或16位的定点分数不是也可以吗?基本上是@adf88的解决方案。是的,很抱歉,我将很快取消上面示例中的模板。不过这很有趣。我得读点书,试试这个。实际上我不确定这到底是怎么回事。
return colors[color];
/************* .h *************/
enum color{
red,
blue,
green,
colors_count
}
const vec3 &getColor(color c)
{
extern const vec3 colors_table[colors_count];
return colors_table[c];
}
/************* .cpp *************/
extern const vec3 colors_table[colors_count] = {
vec3(255, 0, 0), // red
vec3(0, 0, 255), // blue
vec3(0, 255, 0), // green
};