1

我正在尝试构建从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' 的实例后调用终止
  什么():地图::在

我需要采取其他步骤才能mpz_t在地图中使用吗?

4

1 回答 1

1

似乎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;
于 2013-07-31T13:53:33.683 回答