2D矢量 - 通过搜索删除行

时间:2017-01-02 06:48:12

标签: c++ arrays vector

我对矢量很新,需要一些关于矢量操作的额外帮助。

我目前创建了一个全局StringArray Vector,它由文本文件中的字符串值填充。

typedef std::vector<std::string> StringArray;
std::vector<StringArray> array1;

我创建了一个名为“Remove”的函数,它接受来自用户的输入,并最终将输入与数组中的第一个值进行比较,以查看它是否匹配。如果是,则整个行将被删除,并且已删除行下方的所有元素将“拖曳”到填充游戏的位置。

填充的数组如下所示:

Test1 Test2 Test3
Cat1 Cat2 Cat3
Dog1 Dog2 Dog3

删除功能如下所示:

void remove()
{
    string input;

    cout << "Enter the search criteria";
    cin >> input;

我知道我需要一个循环遍历数组并将每个元素与输入值进行比较并检查它是否匹配。

我认为这看起来像:

for (int i = 0; i < array1.size(); i++)
{
    for (int j = 0; j < array1[i].size(); j++)
    {
        if (array1[i] = input)
        **//Remove row code goes here**
    }
}

但据我所知。我不确定A)如果循环是正确的,B)我将如何删除整行(而不仅仅是找到的元素)。我是否需要将array1复制到临时向量,错过指定的行,然后将其复制回到array1?

我最终希望用户输入“Cat1”,然后我的array1最终成为:

Test1 Test2 Test3
Dog1 Dog2 Dog3

感谢所有帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

所以你的循环几乎就在那里。您正确地使用一个索引i来遍历外部向量,然后使用另一个索引j来遍历内部向量。您需要使用j才能获得与input进行比较的字符串。此外,您需要在==语句中使用if进行比较。

for (int i = 0; i < array1.size(); i++)
{
    for (int j = 0; j < array1[i].size(); j++)
    {
        if (array1[i][j] == input)
        **//Remove row code goes here**
    }
}

然后,删除行与删除任何向量元素相同,即调用array1.erase(array1.begin() + i);(请参阅How do I erase an element from std::vector<> by index?

答案 1 :(得分:0)

使用std::vector

backgroundNode.size = self.frame.size 删除项目的效率较低,因为它必须移动所有正在进行的数据。 列表对象将允许您从列表中删除项目(一行),而无需向上移动剩余的行。它是一个链表,因此不允许使用[]运算符进行随机访问。

答案 2 :(得分:0)

您可以使用显式循环,但您也可以使用标准库中已有的已实现循环。

void removeTarget(std::vector<StringArray>& data,
                  const std::string& target) {
    data.erase(
        std::remove_if(data.begin(), data.end(),
            [&](const StringArray& x) {
                return std::find(x.begin(), x.end(), target) != x.end();
            }),
        data.end());
}

std::find实现了一个循环,用于搜索序列中的元素(如果匹配则需要查看),std::remove_if实现循环到&#34;过滤掉&#34;符合特定规则的元素。

在C ++ 11之前,标准算法基本上无法使用,因为没有简单的方法来指定自定义代码参数(例如比较函数),您必须以算法所需的确切形式单独编码它们。

使用C ++ 11 lambdas然而现在算法更有用,并且您不必强制创建(并给出合理的名称)额外的全局类,只是为了实现自定义匹配规则。