2014-11-03 2 views
0

Я использую boost 1.56 и имею unordered_map. Когда я вставить ключевое значение, равное нулю следующим образом:boost unordered_map значение ключа 0

boost::unordered_map<int, int> map; 
for(int i=0; i < size; i++) 
{ 
    int value = another_array[j]; 
    map.insert(i, value); 
} 

Я получаю сбой при обращении к карте, используя map.at (0);

Я проверил, что вставка работает, посмотрев на станде :: pairiterator, BOOL>

, возвращаемые вставки и Ий правда, указывая, что он был успешно вставлен Я создаю локальный к глобальной карте нумерации, поэтому моими ключами все 0: N-1. Я знаю, N и поэтому должны иметь возможность перебора (кол == 0: N-1) следующим образом:

for(int j=0; j < count; j++) 
{ 
    if(map.count(j)) 
     printf("Value at index %d is %d\n", j, map.at(j)); 
} 

, но отсчет к нулю. Если я не выполняю проверку, я получаю ошибку за пределами границ. Как это может произойти? Если я переключусь на использование 1-N в качестве ключей, такой проблемы нет.

Я понимаю, что в этом примере карта слегка переборщила, но у меня есть причины.

Обратите внимание, что я не могу использовать std :: unordered map, поскольку мы являемся кросс-платформой, и наш компилятор linux в настоящее время не поддерживает его.

+0

Вы пробовали 'для (авто и запись: карта) станд :: соиЬ << e.first << " "<< e.second <<" \ п";'? – sehe

+0

Re: EDIT, пожалуйста, сделайте самоназванный пример, который показывает ошибку для вас. – sehe

+0

ну, не совсем так, как я не могу использовать C++ 11, но я попытался использовать boost :: unordered_map :: iterator, который я typedef как ii_iter, и это: 'for (ii_iter i = map.begin (); i! = map.end(); i ++) printf ("ключ:% d value% d \ n", i-> first(), i-> second) 'и не печатает 0 (I нуждался в описанном выше испытании), а также отваливается от конца карты – mike

ответ

1

Перед редактировать: Скорее всего, ваш хэш <> специализация или сравнения равенства key_type нарушается.

Вы не показываете его, но только этот вид ошибки с изменением инварианта может объяснить поведение, которое вы описываете (в самодостаточном минимальном примере), насколько я могу судить.

После редактирования: Вы должны создать автономный пример, который показывает ошибку для вас, для нас, чтобы быть в состоянии придумать лучшей диагностики

+0

карта - это сравнение равенства по умолчанию, действительно ли это плохо в boost? Я полагаю, что хэш может быть плохим. Я просто использую хэш-функцию по умолчанию – mike

+0

@mike вообще. Вот почему, начиная с редактирования, вам действительно нужно приступить к работе с этим SSCCE – sehe

+0

.конечно, самый простой пример! – mike

0

Ответ нашел благодаря sehe заставляет меня писать автономные код. Это показало, что при распределении массива дальше вверх, перезаписывается до конца этого, вызывают нормальную память, и это было всего лишь симптомом.

+1

Если вы находитесь на платформе, которая позволяет это, valgrind или дезинфицирующие средства памяти в clang/gcc сказали бы вам об этом. Кроме того, некоторые инструменты статического анализа, вероятно, предположили бы, что 'sizeof (map)' не то, что вы намеревались – sehe

Смежные вопросы