带有浮点索引的 C++ 数组/向量

Posted

技术标签:

【中文标题】带有浮点索引的 C++ 数组/向量【英文标题】:C++ array/vector with a float index 【发布时间】:2014-03-25 08:55:34 【问题描述】:

我今天注意到我可以给 C++ 向量或数组一个浮点值作为索引。 (例如tab[0.5f]) 这个 Float 值将被转换为 Int 值,然后给我与tab[0] 相同的结果。

这种行为对我来说并不有趣,因为我正在寻找一种方法来以最快的方式访问对象,具体取决于浮点键。 是否可以通过浮点索引保持数组/向量的访问速度?

我知道我的键会出现不准确的问题,但我希望我的浮点值最多能保持 3 位数的精度。

Map<Float, Object> 会做这项工作吗?我在 C++ 参考文档中读到 Map 访问是“对数大小”,这对我来说吸引力不大。

谢谢你:)。

编辑:

我需要将包含 X 个共享顶点的网格 M 转换为包含 X' 个非共享顶点的网格 M'。 顶点的索引设置在 M 中,我知道它处于 TRIANGLE 模式。

我目前的算法是:

对于 M.indexes 中的 i,i+3

取 3 个索引,并推导出它们指向的顶点(得到三角形的 3 个顶点)

计算这些顶点的法线

检查每对 Vertex_i, Normal(i 在 1 和 3 之间,我的 3 个顶点)是否已经存储了这对夫妇,并采取相应措施

...后续步骤

为了检查这对 Vertex,Normal,我使用基于顶点位置的 Array[x][y][z],它是一个浮点数,虽然我知道它不会超过 3digits 精度.

【问题讨论】:

你能给我们一个令人信服的场景,说明你为什么想要一个浮动索引吗?还是您只是想将范围映射到键/索引? 如果您希望浮点数最多保留 3 位数字 - 然后将其乘以 1000 并使用整数索引。因为即使是一个数字后,您也会遇到不准确的问题。 您的按键的范围和精度是多少? 我需要将包含 X 个共享顶点的网格 M 转换为包含 X' 个非共享顶点的网格 M'。顶点的索引设置在 M 中,我知道它处于 TRIANGLE 模式。我目前的算法是:对于 M.indexes 中的 i,i+3 - 取 3 个索引,并推导出它们指向的顶点(三角形) - 在这些顶点上计算法线 - 检查每一对 Vertex_i,Normal(i 介于1 和 3,我的 3 个顶点)如果我已经有了这对夫妇 - ... 下一步要检查这对夫妇 Vertex,Normal,我使用基于顶点位置的 t[x][y][z],它可以是浮点数 哇,没想到我的评论格式这么差。对此感到抱歉。 【参考方案1】:

使用unordered_map。 find 方法在一般情况下具有复杂性:恒定,在最坏情况下:与容器大小呈线性关系。

注意:由于您愿意使用数组,我假设您对有序容器不感兴趣

话虽如此,无论如何,性能取决于输入(网格大小)及其特性,选择最佳解决方案的唯一方法是实施任何合理的解决方案并进行基准测试互相反对。在许多情况下,由于实现细节/内在因素,理论复杂性是无关紧要的。我的意思是,即使有人告诉你 std::vector<std::pair<float, mapped_value>> 在你的情况下表现更好,我实际上必须做一些测试来证明他是对/错

【讨论】:

网格大小不应超过数千个顶点。但是由于每个网格索引应该对该容器进行一次访问,并且每秒左右会有几个网格(3~)需要这个演算,所以我需要尽可能快的容器。

以上是关于带有浮点索引的 C++ 数组/向量的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:用于一对多搜索的浮点数组的余弦相似度索引

我可以直接从 C++ 中向量元素的指针获取索引吗?

在 C++ 索引程序中使用向量时出现分段错误 11

Spark VectorSlice 向量切片

C++:为向量中的非连续索引赋值?

在向量中查找字符串的索引