Jos*_*den 3 c++ dictionary stl
我有一个类Parent
从文件加载配置数据并在一个文件中创建Child
对象std::map
.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) {};
}
Run Code Online (Sandbox Code Playgroud)
如果您的密钥实际上只是您的评论所暗示的任意二进制数据,那么您真正想要的可能是:
std::map<std::vector<char>, Child> children;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
如果密钥长度是固定的,那么你可以简单地使它成为比较对象的一个成员(而不是只是浮动某个地方):
struct MemComparer {
size_t length;
bool operator()(const char* lhs, const char* rhs) const {
return memcmp(lhs, rhs, length) < 0;
}
};
Run Code Online (Sandbox Code Playgroud)
现在map
可以以合理的方式复制 - 您只需要将map
构造函数传递给MemComparer
实例.
归档时间: |
|
查看次数: |
348 次 |
最近记录: |