如何从具有重复项的向量中仅删除一个元素

时间:2018-06-15 01:39:56

标签: c++ vector

我正在用C ++制作D& D游戏。我随机滚动6个分数,将它们放在矢量中,然后将它们显示给玩家。然后我通过每个能力(str,dex,con,int,wis和cha),并调用一个函数,询问玩家他们想要为每个技能使用哪些分数,然后我从矢量中删除它,返回值,然后继续下一个技能。除非存在重复的卷,否则它可以正常工作,在这种情况下,它会删除两个重复项。我希望它一次只删除一个,无论重复,我都无法在网上找到任何东西来做到这一点。这是函数调用

int Character::initScores(std::vector<int> & v, std::string ability)
{

    int c = 0;
    bool error = 0;
    do {

        if (c != 0) {
            std::cout << "That isn't one of your scores. Try again. " << 
            std::endl;
        }
        int choice;
        std::cout << ability << ": ";
        std::cin >> choice;
        if (std::find(v.begin(), v.end(), choice) != v.end())
        {
            v.erase(std::remove(v.begin(), v.end(), choice), v.end());
            std::cout << "Your remaining rolls are ";
            for (int i = 0; i < v.size(); i++)
                std::cout << v[i] << " ";
            std::cout << std::endl;
            return choice;
        }
        else
        {
            c++;
            error = 1;
        }
    } while (error = 1);
}

函数调用

std::cout << "Enter which score you want for... " << std::endl;
strength = initScores(scores, "Strength");
dexterity = initScores(scores, "Dexterity");
constitution = initScores(scores, "Constitution");
intelligence = initScores(scores, "Intelligence");
wisdom = initScores(scores, "Wisdom");
charisma = initScores(scores, "Charisma");

另外请注意,如果我的代码中存在任何低效/不良做法,我最近才开始编写自己的编码项目

1 个答案:

答案 0 :(得分:4)

您正在调用std::remove(),它从容器中“删除”所有匹配的值(实际上,它只是将它们移动到容器的末尾),然后您调用{的2参数重载{1}}从容器中物理删除所有“已删除”值的方法。

如果您只想删除1个元素,请将erase()返回的迭代器传递给std::find()方法的1参数重载:

erase()