带有内存比较的 STL 映射.如何在运行时设置比较块大小
STL map with memcmp comparison. How to set comparison block size at runtime?
我有一个类Parent
,它从文件加载配置数据并在std::map
中创建Child
对象。Child
对象由配置文件中定义的const char*
映射。对于任何给定的Parent
,所有子级将共享相同的密钥长度。因此,一个Parent
映射的Child
对象可能有8字节的键,而另一个Parent
的孩子可能使用4字节的键。
使用此处描述的方法或使用其他方法,如何创建一个新的 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) {};
}
如果你的键真的只是你的评论所暗示的任意二进制数据,那么也许你真正想要的是:
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;
<小时 />如果密钥长度是固定的,那么您可以简单地将其作为比较对象的成员(而不是只是浮动在某个地方):
struct MemComparer {
size_t length;
bool operator()(const char* lhs, const char* rhs) const {
return memcmp(lhs, rhs, length) < 0;
}
};
现在,map
可以以合理的方式复制 - 您只需将map
构造函数传递给一个MemComparer
实例。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 我在c++代码中生成了一个运行时#3异常
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- c++中的指针和运行时错误
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- boost SHA1 哈希与 md5sum/sha1sum 的运行时比较
- MATLAB与C 运行时比较
- 如何在运行时指定Priority_queue的比较类别
- 为什么当 std::sort 中的比较函数始终返回 true 时出现运行时错误
- 带有内存比较的 STL 映射.如何在运行时设置比较块大小
- C++函数,用于比较不同排序算法的运行时
- 在运行时为 std::set 定义自定义比较器
- c++与java中运行时多态性的成本比较
- 使用自定义比较器排序时出现运行时错误
- 对集合的键类型使用比较函数会导致运行时错误