【发布时间】:2012-05-29 18:12:32
【问题描述】:
我真的不明白:
我正在读取点,每个点都包含 3 个浮点值,来自二进制文件。 将此点保存在 unordered_map 中
因此我尝试从这 3 个浮点值中创建一个键:
初衷: 只需使用确切的位作为密钥:
unordered_map<string, vector<float>> points;
string vecToKey( float* a ) {
char bytes[12];
memcpy(bytes, a, 12);
return string(bytes);
}
关键是我绝对想以这种方式消除相同的点 但是
在一个阅读约 21374 点的示例项目中 地图结果大小 = 10640 点
使用以下方法作为密钥创建会产生正确的结果 共 10687 点
string vec3ToKey( float a[3] ) {
float a1[3];
a1[0] = a[0];
a1[1] = a[1];
a1[2] = a[2];
stringstream ss;
boost::archive::text_oarchive oa(ss);
oa << a1;
return ss.str();
}
问题在于速度。第二种方法大约需要 16 秒,第一种方法只需 1-2 秒... 我只是无法解释自己为什么会有差异......
我很欣赏每一个想法:)
【问题讨论】:
-
如果您关心速度,请不要使用
std::strings 作为开始。 -
第一块代码坏了。
string(bytes)怎么知道输出字符串应该是多少字节?第二种方法需要很长时间,因为它必须将浮点数转换为文本。 -
@DavidSchwartz 如果
bytes的长度为 13 并且初始化为零,则第一个可以工作,尽管这仍然是个坏主意。 -
string(bytes)怎么知道它的大小是 13? -
第一个例子也被某些浮点数打破,这些浮点数在其模式中包含零作为一个字节。
标签: c++ floating-point key unordered-map