c++ - 从向量 C++ 中删除字符串
问题描述
在任何纸牌游戏中,当你玩牌时,你会从手中丢失你的牌,但由于我对矢量的了解有限,我做不到。试图推回然后弹回以摆脱向量中的字符串,但不起作用。
//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
是内存中的数组元素。如果你删除中间的一个元素,它后面的所有项目都将向前移动。如果经常这样做,这可能会变得低效。Anstd::list
在这方面效率更高,但代价是迭代时更多的内存交互和更多的链接指针存储空间。您可以测试哪个更适合您。您还可以查看std::unordered_set
,它只能包含每个值一次。但它还有其他问题。始终测试哪个容器效果更好。
psstd::find
你需要#include <algorithm>
推荐阅读
- docker - Kafka-Connect Docker 容器因 JsonSchemaConverter 而失败
- python - 为什么我的“networkx”图不准确并且没有可视化我的输入数据?
- php - 无法删除 php 中的 html 实体
- git - 无法 git 合并,因为 git commit --amend
- javascript - 根据 Firestore 上的值从数组中删除对象(地图)
- microsoft-graph-api - 如果访问令牌在两者之间过期,Microsoft Graph 是否可以使用 @odata:nextLink 对用户集合进行分页?
- imap - 如何在密码中使用带有变音符号的 MailKit 的 ImapClient.Authenticate?
- reactjs - React - 在给定目录中导入多个图像
- tfs - TFVC 强制工作区匹配本地文件夹
- javascript - LARAVEL:如何将电子邮件数据从视图发送到控制器