2015-08-19 3 views
-2

Я создаю массив, в котором каждый индекс содержит кучу связанных списков. Это необходимо для реализации хеш-таблицы. Пример того, как я использую это:Массив связанного списка C++

std::list<string> listArray[sizeOfTable]; 

Будет ли это правильное использование? И как я могу показать содержание этой хеш-таблицы?

+2

std :: unordered_map? – Robinson

+1

_ «Будет ли это правильным использованием?» _ Нет. Я бы никогда не использовал массивы c-style стандартных классов контейнеров C++. Лучшая ставка (если размер фиксирован), используйте 'std :: array , sizeOfTable>'. –

+0

Обратите внимание, что для '[sizeOfTable]' или 'std :: array <..., sizeOfTable>' значение 'sizeOfTable' должно быть константой времени компиляции (хотя GCC имеет нестандартное расширение для массивов переменной длины) - даже если вы не хотите * re * размер вашей таблицы, но вам нужно динамически * pre * -размерять ее - вам будет лучше с 'std :: vector'. –

ответ

0

Вы можете сделать это, но я считаю, что лучшим вариантом является использование std::vector. Вектор представляет собой динамически расширяющийся массив, и вы сможете обрабатывать таблицу хеш-таблицы таким образом.

Что касается второго вопроса - чтобы показать содержимое хеш-таблицы, вам придется перебирать массив и для каждой ячейки вам придется перебирать список в данной ячейке (большинство ячеек будут пустыми, но не проблема).

+2

Таблицы хэшей не изменяются. – ams

+2

@ Вы серьезно? Все разумные хэш-таблицы имеют максимальный коэффициент нагрузки и изменяются при превышении коэффициента нагрузки. Хэш-таблица будет работать довольно плохо, если вы ставите в нее слишком много элементов. –

+1

Почему бы не использовать что-то вроде std :: unordered_map? ... Я что-то упустил. – Robinson

1

Да, вы можете сделать это так.

Чтобы показать содержимое вы должны написать немного кода самостоятельно, возможно, как это:

for (auto& bucket: listArray) { 
    for (auto& item: bucket) { 
     cout << "item: " << item << endl; 
    } 
} 

Конечно, я предполагаю, вы не хотите использовать std::unordered_map (который является имеет таблицу) по уважительной причине.

+0

Вы имели в виду 'unordered_map'? – Banex

+0

Э-э, да, вот и все. – ams

+0

Вложенные петли правильны, но вам нужно «auto &» перед идентификаторами, и хорошо избегать идентификаторов, таких как «list», которые также являются именами в стандартной библиотеке, - смущает людей, ведущих к ошибкам. –