STL映射与memcmp比较.如何在运行时设置比较块大小?

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)

Bar*_*rry 5

如果您的密钥实际上只是您的评论所暗示的任意二进制数据,那么您真正想要的可能是:

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实例.