2013-07-31 4 views
1

Я пытаюсь построить карту от mpz_t ключей до uint значений. Я не знаю, почему, но клавиши mpz_t можно каким-то образом не искать на карте.Использование mpz_t как ключа для std :: map

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

Когда я пытаюсь скомпилировать с последней версией лязгом ++ вместо г ++, я получаю много ошибок компиляции. Похоже, что 'mpz_t' - это typedef типа, который не может использоваться как ключ в' std :: map'. –

+0

@JoachimPileborg Какие критерии должен выполнять тип ключа, чтобы иметь право на использование на карте? Глядя на http://gmplib.org/manual/Integer-Internals.html#Integer-Internals, кажется, что 'mpz_t' является просто своего рода' struct'. Могут ли они не использоваться в качестве типа ключа? – Chris

+0

Возможный дубликат http://stackoverflow.com/q/4254906/1401351 – Peter

ответ

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; 
Смежные вопросы