gpt4 book ai didi

c++ - 从 vector C++ 中删除一个字符串

转载 作者:行者123 更新时间:2023-11-30 04:41:30 25 4
gpt4 key购买 nike

在任何纸牌游戏中,当你玩它时你会失去你的手牌,但由于我对 vector 的了解有限,我无法做到这一点。试图推回然后弹出以从 vector 中删除字符串但不起作用。

//Create vector to store deck names in & player's hands
vector<string> Cards;
vector<string> P1Hand;

//Generate the deck of cards
for (int i = 0; i < SuitNum;i++) //iterate through suits
{
for (auto j : CardValue)
{
card = j.first + suits[i]; //declare card
DeckValue[card] = CardValue[j.first];//add card to deck map and assign value
Cards.push_back(card); // add card to vector
CardNum++;// raise card number for every card added to deck
}
}

//display cards for player 1
while (CardNum > 13)
{
int RCard = rand()%CardNum;//generate a random number based on number of cards left in deck
string DrawCard = Cards.at(RCard); // access a random card
P1Hand.push_back(DrawCard); //add card to hand
Cards.erase(Cards.begin() + RCard); // remove cards from vector so they cant be called twice
CardNum--; //lower available cards
cout<<"["<<DrawCard<<"]"; //print card and its value
}
cout<<endl;
cout<<"Select Card to Play: ",cin>>PlayedCardP1;

我尝试过的:

P1Hand.push_back(PlayedCardP1); //delete last card to next deck
P1Hand.pop_back();

基本上,PlayedCardP1 应该从 P1Hand 中移除

最佳答案

如果你想从 std::vector 中删除一个项目我们使用 std::vector::erase ,就像已经在代码中使用的一样。该函数需要一个迭代器。幸运的是, std::find ,用于查找元素,为您提供迭代器。因此

P1Hand.erase(std::find(std::cbegin(P1Hand), std::cend(P1Hand), PlayedCardP1));

注意 这会使删除点或删除点之后的迭代器和引用无效,包括 end()迭代器。所以在迭代器循环中注意它。请参阅链接的引用页。

旁注:std::vector是内存中的一个数组元素。如果你删除中间的一个元素,它之后的所有项目都会向前移动。如果经常这样做,这可能会变得低效。一个 std::list 这样做效率更高,但是以迭代时更多的内存交互和链接指针的更多存储为代价。您可以测试哪个更适合您。你也可以看看 std::unordered_set , 每个值只能包含一次。但它还有其他问题。始终测试哪个容器工作得更好。

附注对于 std::find你需要 #include <algorithm>

关于c++ - 从 vector C++ 中删除一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59124677/

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