【发布时间】:2019-11-10 17:50:05
【问题描述】:
我有一组字符串,并想将该组的随机元素添加到列表中(例如,将扑克牌分发给不同的玩家)
我尝试了以下方法:
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从牌组的最后一行中删除了分发到最后一行的那张牌,但所有玩家都得到了同一张牌?
【问题讨论】:
-
remaining_cards.erase(it)你只从系列中移除一张牌。在player_cards.emplace_back(remaining_cards.cbegin(), it);中,您通过调用构造函数采用两个迭代器来创建set- 它们从remaining_cards集合中定义范围。所以你的玩家肯定有重复的牌,这真的是你想做的吗? -
iow 使用 emplace_back 可以将多张牌添加到玩家的手牌中,但使用擦除只会从牌组中移除一张牌。
-
我明白了,所以
emplace_back需要两个迭代器。如果我只想添加一个元素怎么办?