Таинственное поведение unordered_map в Visual Studio

, я хочу сохранить ~ 3 000 000 двойных значений в индексах unsigned int в VS2010 C ++. Для этой цели я использую std :: tr1: unordered_map . К сожалению, когда я пытаюсь сохранить значение номер 2 ^ 21, выдается исключение (как будто есть место только для 2 ^ 21-1, т.е. какой-то индекс может использовать только 20 бит). Я попытался перепрограммировать перед сохранением значений, но это тоже не сработало.

В итоге я получил очень простую тестовую программу (которая показала даже немного другое поведение, но все равно):

    std::tr1::unordered_map<unsigned int, float> mapOut;
    //mapOut.rehash(SOMESIZE);
    for (unsigned int i=0; i<3000000; i++)
    {
        if (i%1000==0) std::cout << i << std::endl;
        mapOut[i] = 0.0;
    }

Некоторые случаи, которые я проверил:

1) Если я вообще не перешиваю, программа делает долгий перерыв после вывода в соответствии с i == 32000 (в конечном итоге 2 ^ 15), а затем продолжает i == 262000 (2 ^ 18). Там он хранится вечно (при 100% загрузке ЦП, памяти не увеличивается).

2) Если я сделаю rehash (1000) , то получится i == 65000 ( 2 ^ 16) и сохраняется вечно (загрузка процессора 100%, память не увеличивается).

3) Если я выполняю повторное хеширование (3000000) , цикл успешно завершается, но программа никогда не завершается - т.е. очевидно, что с деструктором возникла какая-то проблема.

Что там происходит, и что еще важнее: что мне с этим делать?!

Большое спасибо за вашу помощь!

12
задан Jakob S. 28 July 2011 в 13:42
поделиться