ber*_*ndh 2 c++ iteration algorithm vector erase-remove-idiom
我无法正确掌握这个想法和程序(我是初学者):我有一个向量.Vector让我们说元素:fieldA,fieldB,fieldC.因此,有了这些向量的数组,我想检查,从数组中的最后一个向量开始,并转到第一个向量的方向,如果其中一个元素具有特定值,则让我们说if(vect [i]. fieldA == 0.0).在这种情况下,如果(vect [i-1] .fieldA == 0.0)具有相同的值,我想从数组中删除整个向量.有人能为我提供一部分可视化的代码,如何创建正确的"反向迭代"循环并使用函数删除它?我尝试使用erase(),remove(),deque()但是我失败了.
我不想在这里弄乱我的代码.
感谢帮助!
我想切割数组,不仅删除向量的内容!在classB和classA之间有适当的继承,所以喂养效果很好,我只想通过删除向量来解决这个问题.示例:2个元素的向量数组.输入:0,1 0,3 3,3 2,3 0,6 5,6 0,8 0,7 0,6输出:0,1 0,3 3,3 2,3 0,6 5,6 0 8.结论:移除了0,7和0,6个载体.
classA tmp;
for (std::vector<std::classB>::iterator iter = newW.begin(); iter != newW.end(); iter++)
{
tmp.set_fieldA(iter->a);
tmp.set_fieldB(iter->b);
tmp.set_fieldC(iter->c);
objA.push_back(tmp);
}
vector<std::classA> objA;
for(int i = objA.size()-1; i > 0; i--)
{
if (objA[i].fieldA == 0.0)
if (objA[i-1].fieldA == 0.0)
objA.erase(objA[i-1]); //remove last vector from array
}
Run Code Online (Sandbox Code Playgroud)
我正在解释你的代码如下.你有一个名为Vector 的结构,有3个成员
struct Vector
{
double fieldA;
double fieldB;
double fieldC;
}
Run Code Online (Sandbox Code Playgroud)
以下代码的工作原理如下.它使用反向迭代器 (和)从后面找到std::find_if_not
与之不同的第一个元素.然后它将其转换为常规迭代器(使用)并将其与向量的末尾进行比较.最后,调用实际上将删除它们(所谓的擦除删除习语)rbegin()
rend()
fieldA
0
base()
v.erase
#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
int main()
{
struct Vector { int fieldA; int fieldB; };
std::vector<Vector> v = {
Vector{ 1, 0 }, Vector{ 2, 1 }, Vector{ 0, 2 }, Vector{ 1, 3 }, Vector{ 0, 4 },
Vector{ 0, 5 }, Vector{ 5, 6 }, Vector{ 6, 7 }, Vector{ 0, 8 }, Vector{ 0, 9 }, Vector{ 0, 10}
};
for (auto& e: v) { std::cout << "{" << e.fieldA << "," << e.fieldB << "}, "; };
std::cout << "\n";
auto m = std::find_if_not(v.rbegin(), v.rend(), [&](Vector const& elem){
return elem.fieldA == 0;
}).base();
if (m != v.end())
// remove all but one matching element
v.erase(m + 1, v.end());
for (auto& e: v) { std::cout << "{" << e.fieldA << "," << e.fieldB << "}, "; };
std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)