现在,说真的......我不会在这里使用坏词,因为我们正在讨论Boost研究员。以这种方式看东西绝对是我的错,但我不明白为什么,所以我会在这里问一下;也许有人可以在这件事上启发我。在这里:
uBLAS有一个名为bounded_vector<>
的漂亮的类模板,用于创建固定大小的向量(或者我认为)。
来自有效的uBLAS维基(http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?Effective_UBLAS):
默认的uBLAS向量和矩阵类型具有可变大小。许多线性代数问题涉及具有固定大小的向量。 2和3个元素在几何中很常见!固定大小的存储(类似于C阵列)可以有效地实现,因为它不涉及与动态存储相关的开销(堆管理)。 uBLAS通过将矢量/矩阵的底层存储从默认的“unbounded_array”更改为“bounded_array”来实现固定大小。
好的,这个bounded_vector<>
用于释放您将向量的底层存储指定为指定大小的bounded_array<>
。在这里,我问你:看起来这个有界向量的东西看起来不是固定大小吗?好吧,它没有。
起初我感觉被wiki背叛了,但后来我重新考虑了“有界”的含义,我想我可以让它通过。但是如果你和我一样(我仍然不确定),仍然想知道这是否有意义,我发现bounded_vector<>
实际上可以调整大小,它可能只是更大< / em>比指定为模板参数的大小。
- 编辑
以防万一,是的,我已经读过这个警告:
应该注意,这只会改变uBLAS用于vector3的存储空间。 uBLAS仍将使用所有相同的算法(假设可变大小)来操纵vector3。在实践中,这似乎对速度没有负面影响。以上运行与手工制作的vector3一样快,不使用uBLAS。唯一的负面影响是vector3总是存储一个“大小”成员,在这种情况下是多余的[或不是吗?我的意思是......]。
我看到它使用相同的算法,假设一个可变的大小,但是如果一个操作实际上要改变它的大小,那么不应该停止它(断言)吗?
ublas::bounded_vector<float,3> v3;
ublas::bounded_vector<float,2> v2;
v3 = v2;
std::cout << v3.size() << '\n'; // prints 2
哦,来吧,这不是普通的背叛吗?
答案 0 :(得分:1)
答案 1 :(得分:1)
游戏中的大多数内容通常都受到3D引擎库的支持。有大量有用的实用程序。例如我使用过Irrlicht(相对较小的引擎),但从来不必离开它们整齐的矢量,矩阵和算法的世界。
对于uBlas而言仍然有效的一个论点是它是事物的助推解决方案。你可以坚持你想要的任何强大的后端,并将其用于实际繁重的工作(搜索:增强ublas的数字绑定)。然后它作为其他库的抽象层,适用于模块化软件。因此,学习uBlas仍然是一种合理的练习,但是,与大多数提升一样,它缺乏直觉性,并且总是倾向于普遍性而不是可用性。 (再次,我的蓝调,sry。)
简而言之:这是一项很有价值的技巧,但是你可以使用你的3d lib提供的linalg或者更好的文档记录,以及一个很好的库。
这也是让你烦恼的轻微不连贯的原因。 bounded_vector的接口应尽可能接近法向量的接口。我同意你的例子中的效果看起来很邪恶。但是如果你想保持与普通std :: vector行为的兼容性,你就没有多少选择了。
bounded_vector只是不做动态扩展。