我正在编写一个基于足球队花名册的程序。每个球员都有球衣号码和等级。我正在尝试弄清楚如果用户输入所说的球员的球衣号码,该如何删除该球员的等级和球衣号码。我定义了两个int向量,一个是球员球衣号码,另一个是球员评分。到目前为止,这是我的删除播放器功能。不知道我在做什么错。
void delete_player()
{
int input;
int vecSize = jersey.size();
cout << "Enter a jersey number to delete: ";
cin >> input;
for (int i = 0; i < vecSize; i++)
{
if (input == jersey[i])
{
jersey.erase(jersey.begin() + i);
rating.erase(rating.begin() + i);
}
}
}
答案 0 :(得分:4)
您似乎在使用错误的工具来完成工作。似乎您需要的是std::map<jerseyNum, rating>
。像这样:
using jerseyNum = int;
using rating = int;
using playerMap = std::map<jerseyNum, rating>;
playerMap Players;
然后您可以通过执行以下操作来添加玩家:
Players [ newJerseyNum ] = newRating;
您可以通过执行以下操作删除玩家:
auto foundPlayer = Players.find(jerseyToDelete);
if (foundPlayer != Players.end())
{
Players.erase(foundPlayer);
}
答案 1 :(得分:4)
无需编写循环来从矢量中删除项目。使用erase/remove
惯用语:
void delete_player()
{
int input;
cout << "Enter a jersey number to delete: ";
cin >> input;
jersey.erase(std::remove(std::begin(jersey), std::end(jersey), input), jersey.end());
rating.erase(std::remove(std::begin(rating), std::end(rating), input), rating.end());
}
基本上,std::remove函数将使迭代器返回到要删除的“死”项(在向量的末尾)。然后从此迭代器开始调用vector::erase
,直到vector::end()
删除这些无效项。
通常,如果您发现自己编写的循环或“手动”代码正在执行似乎以前已经完成过多次的工作(例如从容器中删除项目),则可能有一种STL算法或一系列完成这项工作的STL算法功能。在这种情况下,std::remove
是算法功能。
如果您需要删除相应的rating
,则应该使用std::find
:
void delete_player()
{
int input;
cout << "Enter a jersey number to delete: ";
cin >> input;
auto iter = std::find(std::begin(jersey), std::end(jersey), input);
if (iter != std::end(jersey))
{
auto dist = std::distance(std::begin(jersey), iter);
jersey.erase(std::begin(jersey) + dist);
rating.erase(std::begin(rating) + dist);
}
}
std::distance
只是返回begin()
到std::find
返回的迭代器的“距离”。
但是有实现两个单独的向量并像这样处理它们的危险。如果jersey
和rating
的大小不同,则从rating
向量进行擦除时,您将面临越界访问的风险。给出的另一个答案显示了std::map
的用法,是一个更合适的容器。