c++ - 将集合的随机元素添加到列表中并将其从原始集合中删除
问题描述
我有一组字符串,想将该组的随机元素添加到列表中(例如,将扑克牌分发给不同的玩家)
我尝试了以下方法:
std::set<std::string> remaining_cards;
std::vector<std::set<std::string>> player_cards;
int random_number;
for (int i = 0; i < number_of_players; ++i)
{
random_number = 2; // for simplicity let's assume the random number is always 2
auto it = remaining_cards.cbegin();
std::advance(it, random_number);
player_cards.emplace_back(remaining_cards.cbegin(), it); // get one element
remaining_cards.erase(it); // remove distributed card from deck
}
为什么即使我从牌组中删除了最后一行分发的那张牌,但所有玩家都得到了相同的牌erase
?
解决方案
我不确定您为什么要使用std::set
...可能是因为它会自动对卡片进行分类。我会std::vector
手动使用和排序(std::sort
)。
我必须在您尝试在代码中执行的操作上填写一些空白,因为您没有发布一个有效的完整示例。
我建议使用封装并移动绘制的卡片而不是在删除之前复制。例如
#include <random>
#include <string>
#include <set>
#include <vector>
#include <numeric>
class Random {
private:
std::default_random_engine generator{};
public:
int operator()(int maxValue) { return generator() % maxValue; }
};
class Card {
private:
std::string name{};
public:
Card() : name{} {}
Card& operator= (int i) {
name = std::to_string(i);
return *this;
}
friend bool operator<(Card const& lhs, Card const& rhs) {
return lhs.name < rhs.name; // or some other sorting.
}
};
class Player {
private:
std::set<Card> cards{};
public:
void AddCard(Card&& card) noexcept {
cards.emplace(std::move(card));
}
};
int main() {
//fill the deck
std::vector<Card> deck(42); // instead of remaining cards... why would this be a set?
std::iota(std::begin(deck), std::end(deck), 1); // fill 1 to 42
Random random{};
std::vector<Player> players(4);
while (deck.size() > 0) { // distribute the whole deck.
for (auto& player : players) {
if (deck.empty()) break; // if cards in desck is not equaly dividable between players
auto randIdx = random(deck.size());
player.AddCard(std::move(deck[randIdx])); // move one card
deck.erase(std::next(std::begin(deck), randIdx)); // and remove it from deck
}
}
}
推荐阅读
- laravel - 多对多多态关系中的自定义透视列名称?
- angular - 使用 Angular Universal 在 Angular 中执行服务器端渲染时,页面重定向后无法看到我的 html 源代码
- nao-robot - 听到触发语句但不触发行为
- c# - 如何覆盖newtonsoft json中的“Required.Always”
- python-3.x - 通过 Google Drive File Stream 上传大量文件
- ruby-on-rails - 如何对角色的权限进行分组
- javascript - 为什么 state.map(foo => <>{foo}) 不显示任何内容?
- reactjs - 静态站点的环境变量?
- machine-learning - AttributeError : 'tuple' 没有属性 'to'
- flutter - Flutter:在构建期间调用 setState() 或 markNeedsBuild()