Я искал способ рандомизировать std::map<unsigned int,double>
таким образом, чтобы сохранить ключи и значения вместе, но смешивать элементы. У вас есть хорошее предложение? Я обнаружил, что std::random_shuffle
не работает для карт. Перемешивание значений в векторном формате в моем случае не помогает. Заранее благодарю за любое предложение!Рандомизированная карта в C++
ответ
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
.)
Спасибо, вы, это интересный подход. На следующем шаге я буду запускать цикл for по карте: 'for (auto it = ++ areas.begin(); it! = Areas.end(); it ++) {}'. Как я буду перефразировать его при использовании указателя? –
Или я могу просто использовать 'while (pair_ptrs ++) {}'? –
Вы будете перебирать вектор указателя: 'for (const auto & ptr: pair_ptrs) {do_something (* ptr); } '. –
Невозможно перетасовать std::map
, поскольку этот конкретный контейнер хранит элементы в порядке, указанном его компаратором. A std::unordered_map
не может (легко) использоваться, поскольку он сохраняет свои элементы в соответствии с хэширующей функцией.
Ваш лучший выбор - использовать std::vector<std::pair<unsigned int,double>>
. Вы можете перетасовать это, используя std::shuffle
.
- 1. Интерактивная рандомизированная программа в C
- 2. Рандомизированная часть массива в C#
- 3. C++ Рандомизированная ошибка быстрой сортировки
- 4. C рандомизированная оперативная память (улучшение функции перегородки)
- 5. Рандомизированная функция приветствия - PHP
- 6. Рандомизированная быстрая сортировка
- 7. Рандомизированная проверка кадра данных в формате R
- 8. Python рандомизированная программа не работает
- 9. Карта существования в C++
- 10. интервальная карта в C++
- 11. Рандомизированная обработка списка быстрее, чем Collections.shuffle()?
- 12. рандомизированная сортировка: вероятность сравнения двух элементов?
- 13. Python-подобная карта в C++
- 14. STL карта заявление в C++
- 15. Как карта HALF_PTR в C#
- 16. карта внутри структуры в C++
- 17. реализация быстрого карта в C++
- 18. Карта C# класс в Objective-C один?
- 19. C# Массив Карта/Сбор
- 20. C++ карта вставка
- 21. STL карта и C++
- 22. Карта mutex C++ 11
- 23. C: строка Карта ENUM
- 24. C# щеголеватый карта интерфейс
- 25. C Карта памяти программ
- 26. C++ карта компаратор
- 27. C++ порядок Карта объектов
- 28. C++ карта с структурой
- 29. C# Е.Ф. карта субъектов
- 30. C++ ASCII карта игры
'map' упорядочен по определению, вы * не можете * перетасовать его. Вы также не можете установить порядок элементов в 'unordered_map'. Ваш единственный выбор - использовать контейнер, который имеет порядок, например 'vector'. –
std :: map имеет свои ключи, отсортированные как часть определения «std :: map - сортированный * ассоциативный контейнер» (http://en.cppreference.com/w/cpp/container/map) –