C++ 删除c+中的字段+;矢量

C++ 删除c+中的字段+;矢量,c++,algorithm,vector,iteration,erase-remove-idiom,C++,Algorithm,Vector,Iteration,Erase Remove Idiom,我不能正确地理解这种想法和编程(我是初学者): 我有一个向量。Vector有两个元素:fieldA、fieldB、fieldC。有了这些向量的数组,我想检查,从数组中的最后一个向量开始,到第一个向量的方向,如果其中一个元素有一个特定的值,比如if(vect[I].fieldA==0.0)。在这种情况下,如果(vect[i-1].fieldA==0.0)so具有相同的值,我希望从数组中删除整个向量。有人能给我提供一部分可视化的代码吗?如何创建适当的“反向迭代”循环并使用函数删除它?我正在尝试使用e

我不能正确地理解这种想法和编程(我是初学者): 我有一个向量。Vector有两个元素:fieldA、fieldB、fieldC。有了这些向量的数组,我想检查,从数组中的最后一个向量开始,到第一个向量的方向,如果其中一个元素有一个特定的值,比如if(vect[I].fieldA==0.0)。在这种情况下,如果(vect[i-1].fieldA==0.0)so具有相同的值,我希望从数组中删除整个向量。有人能给我提供一部分可视化的代码吗?如何创建适当的“反向迭代”循环并使用函数删除它?我正在尝试使用erase()、remove()、deque(),但失败了

我不想把我的密码弄乱

谢谢你的帮助

编辑所以我首先在一个循环中输入向量值,然后我想从末尾删除所有包含元素特定值的向量,例如fieldA==0.0 我想剪切数组,而不仅仅是删除向量的内容! classB和classA之间有适当的继承,因此馈送工作正常,我只想通过删除向量来解决这个问题。 示例:2个元素的向量数组。输入:0,10,33,32,30,65,60,80,70,6输出:0,10,33,32,30,60,65,60,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
        }
a类tmp;
对于(std::vector::iterator iter=newW.begin();iter!=newW.end();iter++)
{
tmp.set_fieldA(iter->a);
tmp.set_fieldB(iter->b);
tmp.set_fieldC(iter->c);
objA.推回(tmp);
}
向量objA;
对于(int i=objA.size()-1;i>0;i--)
{
if(objA[i].fieldA==0.0)
if(objA[i-1].fieldA==0.0)
erase(objA[i-1]);//从数组中删除最后一个向量
}

我将对您的代码进行如下解释。您有一个包含3个成员的结构命名向量

struct Vector
{
    double fieldA;
    double fieldB;
    double fieldC;
}
下面的代码如下所示。它使用
std::find_if_
反向迭代器(
rbegin()
rend()
)从后面查找第一个元素,该元素的
字段a与
0
不同。然后将其转换为常规迭代器(使用
base()
),并将其与向量的末尾进行比较。最后,调用
v.erase
实际上会删除它们(所谓的擦除-删除习惯用法


#include

很难从这个问题中准确理解到底发生了什么。如果您向我们展示您的代码,到目前为止,有人可能会告诉您如何修复它。此外,如果您从数组中删除一个向量,这意味着您拥有一个类似于向量向量向量的2D数组?@makciook我认为此上下文中的向量实际上是一个包含成员
fieldA
等的
类,它们存储在一个数组中(或可能
std::vector
)这就是为什么我要求提供代码;它不完全清楚。抱歉,伙计们,我现在提供了我编写的代码。乍一看,我发现的一个错误是,你在应该填充的循环之后声明你的
std::vector objA
。你应该将声明移到第一个循环的上方。这不是我的意思。我不想移动我想要的任何元素如果它们包含0,则为n数组。我希望将它们从数组的末尾移除,以便在末尾是一个不包含0的向量(因为可能根本没有0),或者只有一个向量包含0,而不是更多。例如:0,1 2,1 2,2 0,4 0,5 1,6 0,8 0,7 0,6->我想在这里删除0,7和0,6并获得0,1 2,2 0,4 0,5 1,6 0,8@berndh更新了,带有新的代码示例。它将0,8项保留在后面,但将删除带有0的任何其他尾随元素。谢谢,在线我看到它可以工作,但当我尝试时T在Visual I中得到错误C2552:“V”:非聚集不能用初始化列表初始化,V.PuthJOBACK也不适用于我,因为“不采取多个参数”。您有什么建议吗?@ BNNDH Visual C++ 2012十一月,除了所有库代码(包括<代码> STD::向量< /代码>)之外,CTP都有初始化列表。这将在下一个版本中获得。同时,只使用一组 STD::数组< /C>(VisualC++可以使用初始化列表)。然后创建一个循环,将该数组复制到向量中。不幸的是,这也不起作用,如果无法识别,则查找。\u。是否有其他方法?(以便进行可视化)
#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";   
}