我正在用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");
另外请注意,如果我的代码中存在任何低效/不良做法,我最近才开始编写自己的编码项目
答案 0 :(得分:4)
您正在调用std::remove()
,它从容器中“删除”所有匹配的值(实际上,它只是将它们移动到容器的末尾),然后您调用{的2参数重载{1}}从容器中物理删除所有“已删除”值的方法。
如果您只想删除1个元素,请将erase()
返回的迭代器传递给std::find()
方法的1参数重载:
erase()