У меня есть std::map<mpz_class,int>
(для тех, кто не знаком, mpz_class
— это контейнер класса для очень большого целого числа, определяемый GMP, Gnu Multiprecision Library). Я использую собственный компаратор, который использует функцию cmp()
GMP. На карте я вставил несколько std::pair<mpz_class,int>
с правильными значениями (они разумны, когда я их печатаю).
Однако я заметил, что map::find
работает неправильно, поэтому я напечатал то, что сравнивает компаратор. Оказывается, второй элемент (ключ) всегда представляет собой целочисленное значение с очень диким значением, например 128957236027369832796823768439267, что выходит за рамки целых чисел, с которыми я работаю.
Происходит ли какое-то повреждение памяти, о котором я не знаю? Возможно, mpz_class
нельзя использовать таким образом? Как мне обойти эту проблему? У меня не было этой проблемы с другими контейнерами до сих пор.
#include <map>
#include <gmpxx.h>
#include <iostream>
struct Equaler {
inline bool operator()(const mpz_class a, const mpz_class b) const {
std::cout << " about to return " << a << "," << b << "," << cmp(a,b) << "\n";
return cmp(a, b);
}
};
int main() {
mpz_class x("38268");
std::map<mpz_class,int,Equaler> map;
map.insert(std::pair<mpz_class,int>(x,42));
map.find(x);
return 0;
}
Выход:
about to return 38268,812462232382732367817613904064203084469901797507,-2
std::map<mpz_class, int>
? - person Kerrek SB   schedule 09.11.2013map.insert(std::pair<mpz_class,int>(x,42));
может и неправильная, но она глупая: посмотрите на map::value_type, и если вы не против скопировать, там естьmake_pair
. - person Marc Glisse   schedule 09.11.2013