C++ 删除c+中的字段+;矢量
我不能正确地理解这种想法和编程(我是初学者): 我有一个向量。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载体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
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";
}