std :: map <custom,int =“”> :: find()找不到任何内容

时间:2018-06-27 15:49:18

标签: c++ stdmap

由于某种原因std::map找不到我的对象。

这是我的简化对象:

class LangueISO3 {
public:
    enum {
        SIZE_ISO3 = 3
    };

    static constexpr char DEF_LANG[SIZE_ISO3] = {'-','-','-'};

    constexpr LangueISO3():code() {
        for(size_t i(0); i < SIZE_ISO3; i++){
            code[i] = DEF_LANG[i];
        }
    };
    LangueISO3(const std::string& s) {strncpy(code, s.c_str(), 3);};

    bool operator==(const LangueISO3& lg) const { return strncmp(code, lg.code, 3) == 0;};
    bool operator<(const LangueISO3& lg)const { return code < lg.code;};

private:
    char code[SIZE_ISO3];
};

我的测试是:

{
    CPPUNIT_ASSERT_EQUAL(LangueISO3("eng"), LangueISO3("eng"));

    std::map<LangueISO3, int> lmap;
    lmap.emplace(LangueISO3("fra"), 0);
    lmap.emplace(LangueISO3("deu"), 1);
    lmap.emplace(LangueISO3("eng"), 2);
    auto it = lmap.find(LangueISO3("deu"));
    CPPUNIT_ASSERT_EQUAL(1, it->second);
}

第一个测试没有问题,但是第二个失败。 lmap.find()总是返回lmap.end()

我做错了什么?

1 个答案:

答案 0 :(得分:1)

您不能使用<运算符比较字符数组。当您编写code < lg.code时,编译器将比较code数组的地址,而不是数组的内容。

operator<的定义更改为使用strncmp

bool operator<(const LangueISO3& lg)const {
    return strncmp(code, lg.code, SIZE_ISO3) < 0;
}

此外,对operator==的比较应使用SIZE_ISO3常量,而不是对3处的大小进行硬编码。