2

我无法正确掌握这个想法和编程这样的事情(我是初学者):我有一个向量。向量可以说元素:fieldA、fieldB、fieldC。因此,有了这些向量的数组,我想检查,从数组中的最后一个向量开始,然后转到第一个向量的方向,如果其中一个元素具有特定值,可以说 if (vect[i].字段A == 0.0)。在这种情况下,如果 (vect[i-1].fieldA == 0.0) so 具有相同的值,我想从数组中删除整个向量。有人可以为我提供一部分可视化的代码,如何创建正确的“反向迭代”循环并使用函数删除它?我正在尝试使用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
        }
4

1 回答 1

5

我将您的代码解释如下。你有一个名为 Vector的结构,它有 3 个成员

struct Vector
{
    double fieldA;
    double fieldB;
    double fieldC;
}

下面的代码工作如下。它std::find_if_not反向迭代器 ( rbegin()and rend()) 一起使用从后面查找与 fromfieldA不同的第一个元素0。然后它将其转换为常规迭代器(使用base())并将其与向量的末尾进行比较。最后调用v.erase实际上会擦除它们(所谓的erase-remove idiom

#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";   
}

LiveWorkSpace上的输出

于 2013-02-05T09:31:33.477 回答