2D矢量-通过搜索删除行
2D Vector - Remove Rows by search
我对向量很陌生,需要一些关于向量操作的额外帮助。
我目前已经创建了一个全局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,现在算法更可用了,您不必仅仅为了实现自定义的匹配规则而被迫创建(并给它一个合理的名称)一个额外的全局类。
- 如何在我从C++文件中读取后立即删除行
- 从 xtensor 中的视图中删除行
- 从 TXT 文件中删除行不起作用
- 使用正则表达式从文件中删除行注释
- 从文件MQL4删除行
- 如何在多维数组中搜索单个行,然后对某些行中的每个单个元素执行计算
- 使用自定义模型从Qtreeview删除行
- 分段错误从矩阵中删除行
- Qt表小部件,按钮删除行
- 2D矢量-通过搜索删除行
- 二进制树搜索删除节点复杂性
- Armadillo-在立方体中删除行
- c++从文本文件中删除行(需要解释)
- 从简历垫中删除行或列的最佳方法是什么
- 二叉搜索 删除目标节点的树有两个子节点
- 在QTreeView中插入和删除行
- 如何在 XML 文本(在标记内)中搜索换行符
- 如何验证是否已在 SQL 服务器中删除行
- QTextEdit插入和删除行的速度非常慢.无论如何,让它更快
- 搜索作为行和列的m/n的2D阵列中的元素