Как перемешать ключ элемента в std::map?
Я ищу способ перемешать std:: map в C++. У меня есть std:: map с ключом в качестве целых чисел и значением как структурой, и я хочу перемешать ключи. Я пытался использовать std::random_shuffle, но он не компилируется. Итак, я создал временный вектор, я заполнил этот вектор, перетасовал его и использовал, чтобы поменять местами на карте.
Вот как я сейчас делаю:
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <ctime>
#include <cstdlib>
std::vector<int> temp_vec_registration;
int myrandom(int i) { return std::rand()%i; }
struct CRegInfo
{
bool success;
int num_order;
int type;
CRegInfo(bool succ, int num, int type)
: success(succ), num_order(num), type(type)
{}
};
typedef std::map<int, CRegInfo> RegInfo;
RegInfo register_chars;
int main()
{
std::srand(unsigned(std::time(0)));
temp_vec_registration.clear();
register_chars.clear();
for (int i = 0; i <= 10; i++)
temp_vec_registration.push_back(i);
std::random_shuffle(temp_vec_registration.begin(), temp_vec_registration.end(), myrandom);
for (std::vector<int>::iterator it1=temp_vec_registration.begin(); it1!=temp_vec_registration.end(); ++it1)
register_chars.insert(RegInfo::value_type(*it1, CRegInfo(false, 0, 0)));
for (auto it2 = register_chars.begin(); it2 != register_chars.end(); ++it2)
std::cout << it2->first << "\t";
}
Но это не работает, вектор имеет случайное число, но карта всегда имеет одинаковые числа в ключе. (0, 1, 2, 3.. 10).
1 ответ
Хм, хотя это технически возможно при некотором дополнительном взломе, но при наивном подходе…std::map
является упорядоченным хранилищем, т. е. поддерживает порядок среди своих ключей, что является его основной особенностью, по цене логарифмических сложностей простых операций.
std::unordered::map
, как следует из названия, не дает таких гарантий, так что вы можете попытать счастья, сделав то же самое с unordered_map
... Если вы просто хотите перебирать элементы карты в неопределенном порядке, используйте для этого свой перемешанный вектор.