gpt4 book ai didi

c++ - STL 映射与 memcmp 比较。如何在运行时设置比较 block 大小?

转载 作者:太空狗 更新时间:2023-10-29 20:36:38 24 4
gpt4 key购买 nike

我有一个类 Parent,它从文件加载配置数据并在 std::map 中创建 Child 对象。 Child 对象由配置文件中定义的 const char* 映射。对于任何给定的 Parent,所有子级都将共享相同的 key 长度。因此,一个 Parent 的映射 Child 对象可能有 8 字节的键,而另一个 Parent 的 child 可能使用 4 字节的键。

这怎么可能,要么使用方法 described here , 或者使用另一种方法,创建一个新的 std::map 成员对象,该对象具有依赖于仅在运行时可用的数据的比较函数?

具体来说,我正在尝试使用 memcmp(a, b, n); 就像之前链接的问题所示,但我希望 n 是可变的而不是固定为 4。

如果我没有很好地解释我正在尝试做什么,我会尝试将其放入代码中。我如何编写 compareKey 以便它使用 childKeyLength 来比较映射键:

class Child;
class Parent {
private:
struct compareKey {
bool operator()(char * const a, char * const b) {
return memcmp(a, b, childKeyLength) < 0;
}
};
std::map<const char*, Child, compareKey> children;
size_t childKeyLength;

public:
Parent(size_t childKeyLength)
: childKeyLength(childKeyLength) {};
}

最佳答案

如果您的 key 真的像您的评论所暗示的那样只是任意二进制数据,那么您真正想要的可能是:

std::map<std::vector<char>, Child> children;

vector已经有一个 operator<实现了严格的弱排序,所以这才有效。


如果其他东西拥有数据,那么我建议将长度包装到类型中并进行比较:

struct Data {
const char* p;
size_t len;
};

struct DataComparer {
bool operator()(Data const& lhs, Data const& rhs) const {
int cmp = memcmp(lhs.p, rhs.p, std::min(lhs.len, rhs.len));
return cmp < 0 || cmp == 0 && lhs.len < rhs.len;

// or if you're feeling feisty?
// return std::make_tuple(memcmp(lhs.p, rhs.p, std::min(lhs.len, rhs.len)), lhs.len)
// < std::make_tuple(0, rhs.len);
}
};

std::map<Data, Child, DataComparer> children;

如果 key 长度是固定的,那么您可以简单地将其作为比较对象的成员(而不是它只是 float 在某处):

struct MemComparer {
size_t length;

bool operator()(const char* lhs, const char* rhs) const {
return memcmp(lhs, rhs, length) < 0;
}
};

现在 map以合理的方式可复制 - 你只需要通过 map构造函数 a MemComparer实例。

关于c++ - STL 映射与 memcmp 比较。如何在运行时设置比较 block 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37470190/

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