gpt4 book ai didi

c++ - 从 map 中选择随机元素子集

转载 作者:行者123 更新时间:2023-12-02 09:56:17 26 4
gpt4 key购买 nike

我有一张元素图:

   std::map<char,int> values;

values['a']=10;
values['b']=30;
values['c']=50;
values['d']=70;
values['e']=90;
values['f']=100;
values['g']=120;

所以我需要从 values中挑选N个元素最好作为对的映射(输出格式和输入格式)。

我从 stackoverflow 尝试了其他不同的解决方案,但它们主要适用于 vector 而不适用于任何类型的 C++ 11 容器,或者对我来说看起来太复杂了。

我需要一些比 random_shuffle 更有效的方法它实际上改变了 C++ 容器。

如果这个函数适用于任何类型的 C++ 容器,那就太好了。

最佳答案

您可以复制 std::map<char, int> 的 key 进入 std::vector<char> .然后,用 std::random_shuffle 打乱这个 vector 十、最后返回num map 元素:键为num的元素 vector 中的最后一个键:

std::vector<std::pair<char, int>> pick_random(const std::map<char, int>& m, size_t num)
{
std::vector<char> keys;
keys.reserve(m.size());

// copy the map's keys
std::transform(m.begin(), m.end(), std::back_inserter(keys),
[](const std::pair<const char, int>& p) {
return p.first;
}
);

// shuffle the keys
std::random_shuffle(keys.begin(), keys.end());

// number of elements to pick
num = std::min(num, m.size());

std::vector<std::pair<char, int>> res;
res.reserve(num);

// pick num elements
std::generate_n(std::back_inserter(res), num,
[&keys, &m]() {
auto it = m.find(keys.back());
keys.pop_back();
return *it;
}
);

return res;
}

这个想法是随机打乱包含键的 vector 中的元素(即 keys )。因此,您将映射到映射中元素的键打乱。您可以使用这些随机打乱的键以随机方式从 map 中获取元素。

异或 std::shuffle 安装自 std::random_shuffle已在 C++14 中弃用并在 C++17 中删除。

关于c++ - 从 map 中选择随机元素子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59813448/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com