搜索一个值,然后从对象数组中删除包含该值的对象

To search a value and then delete object containing it from an array of objects?

本文关键字:对象 数组 删除 包含该 搜索 一个 然后      更新时间:2023-10-16
#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为类名)中查找并删除对象。begen是指向起始和结束的迭代器。

find是否接受该对象作为它的第三个参数?如果不是,我可以用什么方法删除对象?实际上,我想从对象数组中搜索特定属性(如id, name) ,然后删除该对象

请通知吗?

我的建议:

  1. 简化。您可以用更小的代码重现此错误。
  2. 发布错误消息。此代码不会抛出错误,而是无法编译。
  3. 读取错误信息。类' A '缺少相等操作符(' operator== '),因此' find '无法对其进行操作——它如何知道何时找到了匹配?
  4. 在添加细节时测试它们。您应该在尝试' find '之前捕获' v[0]. putdata (v) '。
  5. 在尝试自动化之前先学会手工做事情。如果您在尝试使用' find '之前尝试使用循环查找并删除' v[1] ',那么所有这些都将很清楚。
  6. 如果你想做更微妙的事情,比如通过不同的属性搜索,你将不得不自己编写循环,或者学习更微妙的工具,比如函数,' remove '和' find_if '。猜猜我觉得你应该先学哪一个。
  7. 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函数上工作。