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

2D Vector - Remove Rows by search

本文关键字:搜索 删除行 -通 矢量 2D      更新时间:2023-10-16

我对向量很陌生,需要一些关于向量操作的额外帮助。

我目前已经创建了一个全局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",然后我的数组1最终为:

Test1 Test2 Test3
Dog1 Dog2 Dog3

感谢所有的帮助。非常感谢。

所以循环就快到了。使用一个索引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);(请参阅如何通过索引从std::vector<>中删除元素?)

使用std::list<StringArray> array1;

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

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

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实现了一种循环来"过滤掉"与特定规则匹配的元素。

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

然而,有了C++11 lambdas,现在算法更可用了,您不必仅仅为了实现自定义的匹配规则而被迫创建(并给它一个合理的名称)一个额外的全局类。