2017-01-09 4 views
0

Я искал способ рандомизировать std::map<unsigned int,double> таким образом, чтобы сохранить ключи и значения вместе, но смешивать элементы. У вас есть хорошее предложение? Я обнаружил, что std::random_shuffle не работает для карт. Перемешивание значений в векторном формате в моем случае не помогает. Заранее благодарю за любое предложение!Рандомизированная карта в C++

+3

'map' упорядочен по определению, вы * не можете * перетасовать его. Вы также не можете установить порядок элементов в 'unordered_map'. Ваш единственный выбор - использовать контейнер, который имеет порядок, например 'vector'. –

+0

std :: map имеет свои ключи, отсортированные как часть определения «std :: map - сортированный * ассоциативный контейнер» (http://en.cppreference.com/w/cpp/container/map) –

ответ

3

std::map is a sorted associative container, поэтому он не поддерживает произвольное перегруппировку пар ключ-значение.

Предполагая, что вам нужна карта ассоциировать ключ и значение, вы можете использовать вспомогательную std::vector указателей на элементы карты, чтобы определить другую последовательность итераций:

using pair_type = std::pair<unsigned int, double>; 
std::vector<const pair_type*> pair_ptrs; 

for(const auto& p : your_map) 
{ 
    pair_ptrs.emplace_back(&p); 
} 

std::shuffle(std::begin(pair_ptrs), std::end(pair_ptrs), /* ... */); 

(Обратите внимание, что std::random_shuffle is deprecated. Вместо этого вы должны использовать std::shuffle.)

+0

Спасибо, вы, это интересный подход. На следующем шаге я буду запускать цикл for по карте: 'for (auto it = ++ areas.begin(); it! = Areas.end(); it ++) {}'. Как я буду перефразировать его при использовании указателя? –

+0

Или я могу просто использовать 'while (pair_ptrs ++) {}'? –

+0

Вы будете перебирать вектор указателя: 'for (const auto & ptr: pair_ptrs) {do_something (* ptr); } '. –

2

Невозможно перетасовать std::map, поскольку этот конкретный контейнер хранит элементы в порядке, указанном его компаратором. A std::unordered_map не может (легко) использоваться, поскольку он сохраняет свои элементы в соответствии с хэширующей функцией.

Ваш лучший выбор - использовать std::vector<std::pair<unsigned int,double>>. Вы можете перетасовать это, используя std::shuffle.

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