我正在尝试构建从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”等的线,但这不会发生。代替:
terminate called after throwing an instance of 'std::out_of_range' what(): map::at
我需要采取其他措施才能在地图中使用mpz_t
吗?
答案 0 :(得分:1)
似乎map
无法比较两个mpz_t
个实例。
根据the C++ reference地图实现为二叉搜索树。因此,如果无法比较元素,则无法进行搜索。
添加比较器解决了这个问题:
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;