删除c ++向量中的字段

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()但是我失败了.

我不想在这里弄乱我的代码.

感谢帮助!

编辑.所以我首先使用向量值在循环中输入数组,然后我想从末尾删除所有向量,包含元素特定值,例如fieldA == 0.0

我想切割数组,不仅删除向量的内容!在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)

Tem*_*Rex 5

我正在解释你的代码如下.你有一个名为Vector 的结构,有3个成员

struct Vector
{
    double fieldA;
    double fieldB;
    double fieldC;
}
Run Code Online (Sandbox Code Playgroud)

以下代码的工作原理如下.它使用反向迭代器 (和)从后面找到std::find_if_not与之不同的第一个元素.然后它将其转换为常规迭代器(使用)并将其与向量的末尾进行比较.最后,调用实际上将删除它们(所谓的擦除删除习语)rbegin()rend()fieldA0base()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)

LiveWorkSpace上的输出