Jeśli chcesz przetasować mapę w miejscu, można zaimplementować własną wersję random_shuffle
dla map
. Rozwiązanie nadal wymaga umieszczenia klawiszy do wektora, która jest wykonywana przy użyciu transform
poniżej:
typedef std::map<int, std::string> map_type;
map_type m;
m[10] = "hello";
m[20] = "world";
m[30] = "!";
std::vector<map_type::key_type> v(m.size());
std::transform(m.begin(), m.end(), v.begin(),
[](const map_type::value_type &x){
return x.first;
});
srand48(time(0));
auto n = m.size();
for (auto i = n-1; i > 0; --i) {
map_type::size_type r = drand48() * (i+1);
std::swap(m[v[i]], m[v[r]]);
}
użyłem drand48()/srand48()
jednolitej pseudo generator liczb losowych, ale można użyć, co jest najlepsze dla Ciebie.
Alternatywnie można przetasować v
, a następnie odbudować map
, takich jak:
std::random_shuffle(v.begin(), v.end());
map_type m2 = m;
int i = 0;
for (auto &x : m) {
x.second = m2[v[i++]];
}
Ale chciałem pokazać, że wdrażanie SHUFFLE na mapie w miejscu, nie jest zbyt uciążliwe.
Jeśli klawisze są bardziej kompaktowe niż swoimi wartościami, można nacisnąć klawisze do wektora, losowe, wtedy użyć tych, aby określić nową sekwencję wartości. – jxh
To jest dobry pomysł. –
To może być [XY Problem] (http://meta.stackexchange.com/q/66377). Co próbujesz osiągnąć? –