C++迭代向量并删除匹配的字符串

Wil*_*ill 0 c++ iterator stdvector

我正在尝试编写字符串列表.用户可以添加到列表或从列表中删除,以及显示当前列表.

显示列表和添加到列表工作正常,但我无法弄清楚如何通过遍历列表来查找匹配来删除用户的字符串.

我如何更改我的代码来解决这个问题? 看看是否(答案== 3)

// InClassAssignment-FavouriteGameList.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <ctime>
#include <cctype>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    vector <string>  gameList;
    int answer = 0;
    bool cont = true;
    int size = 0;
    vector<string>::iterator iter;
    string addToList;
    string removeFromList;

    cout << "\tGame List" << endl;

    while (cont)
    {
        cout << "--------------------------------------------" << endl;
        cout << "\nWhat do you want to do?";
        cout << "\n1 - Display List";
        cout << "\n2 - Add to List";
        cout << "\n3 - Remove from List";
        cout << "\n4 - End program" << endl << "Selection: ";
        cin >> answer;

        cout << endl;

        if (answer == 1)
        {
            cout << "List: ";
            for (iter = gameList.begin(); iter != gameList.end(); ++iter)
            {
                if (iter != gameList.end() - 1)
                    cout << *iter << ", ";
                else
                    cout << *iter << endl;
            }
        }

        else if (answer == 2)
        {
            cout << "Type in a game to add: ";
            cin >> addToList;
            gameList.push_back(addToList);
            cout << "\nAdded (" << addToList << ") to your list." << endl;
        }

        else if (answer == 3)
        {
            //display list
            cout << "List: ";
            for (iter = gameList.begin(); iter != gameList.end(); ++iter)
            {
                if (iter != gameList.end() - 1)
                    cout << *iter << ", ";
                else
                    cout << *iter << "\n" << endl;
            }

            //ask which one to remove
            cout << "Which game should be removed?: ";
            cin >> removeFromList;

            //loop/iterate through the list to find a match and erase it
            for (iter = gameList.begin(); iter != gameList.end(); ++iter)
            {
                if ()
                    cout << "\nRemoved (" << removeFromList << ")" << endl;
                else
                    cout << "\nGame not found" << endl;
            }

        }

        else
        {
            cont = false;
        }

    }

    cout << "\nThanks for using the program!\n" << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

w.b*_*w.b 5

您可以使用std::find获取与要删除的项匹配的迭代器,然后调用vector::erase(iter)

auto iter = std::find(gameList.begin(), gameList.end(), removeFromList);
if (iter != gameList.end())
{
    gameList.erase(iter);
}
Run Code Online (Sandbox Code Playgroud)

  • @DieterLücking实际上,对于`erase`的单个参数形式,检查是必要的,因为参数需要是可解引用的,而`end()`则不是.在表格的某处提到了序列容器的要求.要求[在cppreference上列出](http://en.cppreference.com/w/cpp/container/vector/erase)也是. (3认同)