Nếu bạn muốn shuffle bản đồ tại chỗ, bạn có thể thực hiện phiên bản của riêng bạn random_shuffle
cho map
của bạn. Các giải pháp vẫn đòi hỏi đặt các phím vào một vector, được thực hiện dưới đây sử dụng transform
:
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]]);
}
tôi đã sử dụng drand48()/srand48()
cho một bộ đồng phục giả bộ tạo số ngẫu nhiên, nhưng bạn có thể sử dụng bất cứ điều gì là tốt nhất cho bạn.
Ngoài ra, bạn có thể xáo trộn v
, và sau đó xây dựng lại các map
, chẳng hạn như:
std::random_shuffle(v.begin(), v.end());
map_type m2 = m;
int i = 0;
for (auto &x : m) {
x.second = m2[v[i++]];
}
Nhưng, tôi muốn để minh họa rằng thực hiện ngẫu nhiên trên bản đồ tại chỗ là không quá nặng nề.
Nếu các phím là nhỏ gọn hơn giá trị của bạn, bạn có thể đẩy các phím vào một vector, shuffle đó, sau đó sử dụng những để xác định chuỗi giá trị mới của bạn. – jxh
Đó là một ý tưởng hay –
Đây có thể là [Vấn đề XY] (http://meta.stackexchange.com/q/66377). Bạn đang cố gắng đạt được điều gì? –