gpt4 book ai didi

c++ 从 3 个浮点值生成 unordered_map 的键

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:26 25 4
gpt4 key购买 nike

我真的不明白:

我正在读取二进制文件中的点,每个点都包含 3 个浮点值。将这些点保存在 unordered_map 中

因此我尝试从这 3 个浮点值中创建一个键:

初衷:只需使用确切的位作为 key :

unordered_map<string, vector<float>> points;
string vecToKey( float* a ) {
char bytes[12];
memcpy(bytes, a, 12);
return string(bytes);
}

关键是我绝对想用这种方式消除相同的点但是

在一个示例项目中读取了大约 21374 点 map 结果大小 = 10640 点

使用以下方法作为 key 创建会产生正确的结果共 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 秒......我只是无法解释为什么会有差异......

我很欣赏每一个想法:)

最佳答案

string vecToKey( float* a ) {
char bytes[12];
memcpy(bytes, a, 12);
return string(bytes);
}

您正在使用的字符串构造函数在第一个空字节处停止。浮点值可以包含空字节。所以字符串可能不能准确地表示三个 float 。您可以通过在其中粘贴断言来查看:

  string s(bytes);
assert(s.size() == sizeof bytes);
return s;
}

另一个问题是bytes可能包含空字节,并且程序可能将随机垃圾复制到字符串中或以其他方式表现出未定义的行为。

我建议您不要尝试以这种方式滥用字符串。您需要一个包含三个 float 的键,因此请使用一个完全代表该键的键:std::array<float,3> .或者更好的是使用“点”类,因为这就是三个 float 所代表的。

因为数组没有内置的散列函数,你可以使用这样的东西:

// taken from http://stackoverflow.com/questions/6899392/generic-hash-function-for-all-stl-containers
template <class T>
inline void hash_combine(std::size_t & seed, const T & v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}

struct Hasher {
size_t operator() (std::array<float,3> const &v) {
size_t h = std::hash<float>()(v[0]);
hash_combine(h,v[1]);
hash_combine(h,v[2]);
return h;
}
};


std::unordered_map<std::array<float,3>,vector<float>,Hasher> map;

关于c++ 从 3 个浮点值生成 unordered_map 的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10804455/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com