搜索一个值,然后从对象数组中删除包含该值的对象
To search a value and then delete object containing it from an array of objects?
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class A
{
public :
void getData(vector< A > &);
void putData(vector< A > &);
private :
int x;
char name[90];
};
vector< A > v;
void A :: getData(vector< A > &Aref)
{
cout << "id = ";
cin >> x;
cout << "nname = ";
cin >> name;
}
void A :: putData(vector< A > &Aref)
{
cout << "size of vector is " << Aref.size() << endl;
for(int i=0; i < Aref.size(); i++)
cout << Aref[i].x << " : " << Aref[i].name << endl;
cin.ignore(numeric_limits< streamsize >::max(), 'n');
cin.get();
}
int main()
{
for(int i=0; i < 3; i++)
{
v.push_back(A());
v[0].getData(v);
v[0].putData(v);
}
vector< A >::iterator beg = v.begin(), en = v.end();
//v.erase( find(beg, en, v[1]) ); ----------------> DOESN'T WORK
return 0;
}
我用过这个v.erase( find(beg, en, v[1]) );
(return 0;
前倒数第二行)
命令,在阵列vector< A > v;
(A为类名)中查找并删除对象。beg
和en
是指向起始和结束的迭代器。
find是否接受该对象作为它的第三个参数?如果不是,我可以用什么方法删除对象?实际上,我想从对象数组中搜索特定属性(如id, name) 值,然后删除该对象。
请通知吗?
我的建议:
- 简化。您可以用更小的代码重现此错误。
- 发布错误消息。此代码不会抛出错误,而是无法编译。
- 读取错误信息。类' A '缺少相等操作符(' operator== '),因此' find '无法对其进行操作——它如何知道何时找到了匹配?
- 在添加细节时测试它们。您应该在尝试' find '之前捕获' v[0]. putdata (v) '。
- 在尝试自动化之前先学会手工做事情。如果您在尝试使用' find '之前尝试使用循环查找并删除' v[1] ',那么所有这些都将很清楚。
- 如果你想做更微妙的事情,比如通过不同的属性搜索,你将不得不自己编写循环,或者学习更微妙的工具,比如函数,' remove '和' find_if '。猜猜我觉得你应该先学哪一个。
- EDIT:在尝试擦除迭代器之前测试它们。如果你不明白为什么这很重要,那你对迭代器的研究还不够。
为什么要这样做,getter和setter函数不应该是这样的,应该是:
void A :: getData() // why t
{
cout << "id = ";
cin >> x;
cout << "nname = ";
cin >> name;
}
void A :: putData()
{
cout<<"The name is :" << name <<endl;
cout<<"id is :"<<x<<endl;
}
在main()中(必须声明==操作符,以便可以比较用户定义的对象):
for(int i=0; i < 3; i++)
{
v.push_back(A());
v[i].getData();
v[i].putData();
}
vector< A >::iterator beg = v.begin(), en = v.end();
v.erase(remove(beg ,end , v[0]) , v.end());
return 0;
您似乎正在寻找的不是std::find,而是std::find_if。下面是一个例子:
谢谢大家,我知道我缺少什么了,我在类A中添加了==运算符,就像:
bool A :: operator==(const A &t) const
{
return ( x == t.x && (strcmp(name, t.name) == 0) );
}
我按照M3taSpl0it
的指示使用了getter和setter就删除对象而言,它在find函数上工作。
相关文章:
- 将对象数组的引用传递给函数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 类对象数组的问题会导致崩溃
- Arduino C++在构造函数中用参数声明对象数组
- 使用对象数组对 SFML 进行动画处理
- C++ 对象数组堆栈溢出
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何初始化对象数组?
- C++创建对象数组
- 在对象数组中搜索字符串并返回相应值的函数
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 使用 C++ 创建对象数组
- 对象数组打印空白字符串
- 重载运算符 [] 用于从对象数组中给出特定索引
- 如何在 C++ 中使用提升属性树从 JSON 文件中读取对象数组