在C ++中从向量中删除元素

时间:2018-12-06 03:56:01

标签: c++

我正在编写一个基于足球队花名册的程序。每个球员都有球衣号码和等级。我正在尝试弄清楚如果用户输入所说的球员的球衣号码,该如何删除该球员的等级和球衣号码。我定义了两个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);
            }

        }
    }

2 个答案:

答案 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返回的迭代器的“距离”。

但是有实现两个单独的向量并像这样处理它们的危险。如果jerseyrating的大小不同,则从rating向量进行擦除时,您将面临越界访问的风险。给出的另一个答案显示了std::map的用法,是一个更合适的容器。