使用mpz_t作为std::map的键

Using mpz_t as key for std::map

本文关键字:map 的键 std 作为 mpz 使用      更新时间:2023-10-16

我正在尝试构建一个从mpz_t键到uint值的映射。我不知道为什么,但mpz_t密钥在地图上找不到。

mpz_t leftSideValues[1 << 20];
int main()
{
    std::map<mpz_t, uint> leftSide;
    for (uint i = 0; i < 1 << 20; i++)
    {
        mpz_init(leftSideValues[i]);
        // compute some stuff here...
        // now save the computed value to our map
        leftSide[leftSideValues[i]] = i;
        // do a lookup to see whether our value can be found
        std::cout << leftSide.at(leftSideValues[i]) << " -- " << i << std::endl;
    }
    return 0;
}

预期的输出将是许多看起来像"0-0"、"1-1"等的行,但这并没有发生。相反:

抛出"std::out_of_range"的实例后调用
terminatewhat():映射::在

为了使mpz_t在地图中可用,我还需要采取其他步骤吗?

似乎map无法比较两个mpz_t实例。

根据C++,参考映射被实现为二进制搜索树。因此,如果元素无法进行比较,则搜索是不可能的。

添加比较器修复了此问题:

struct mpzCompare
{
    bool operator() (const mpz_t val1, const mpz_t val2) const
    {
        return mpz_cmp(val1, val2) > 0;
    }
};
std::map<mpz_t, uint, mpzCompare> leftSide;