首页 > 解决方案 > 从向量 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 中删除

标签: c++

解决方案


如果你想从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>


推荐阅读