要搜索值,然后从对象数组中删除包含它的对象?

时间:2011-05-01 11:49:40

标签: c++ vector find

#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),然后删除该对象。< / p>

请指教?

4 个答案:

答案 0 :(得分:3)

我的建议:

  1. 简化。您可以使用更小的代码重现此错误。
  2. 发布错误消息。此代码不会抛出错误,无法编译。
  3. 阅读错误消息。你的类'A`缺少一个相等的运算符(`operator ==`),所以`find`不能对它起作用 - 怎么知道它什么时候找到匹配?
  4. 在添加细节时测试细节。你应该在尝试“查找”之前找到`v [0] .putData(v)`。
  5. 在尝试自动化之前,先学会手动操作。如果你试图使用循环找到并删除`v [1]`,那么在你尝试使用`find`之前,所有这些都是清楚的。
  6. 如果你想做更多微妙的事情,比如搜索不同的属性,你必须自己编写循环,或者学习更多微妙的工具,如functor,`remove`和`find_if`。猜猜我认为你应该先学习哪一个。
  7. 编辑:在尝试删除它们之前测试迭代器。如果您不明白为什么这很重要,那么您还没有充分研究过迭代器。

答案 1 :(得分:2)

为什么要这样做,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; 

答案 2 :(得分:0)

你似乎在寻找的不是std :: find,而是std :: find_if。 Here就是一个例子。

答案 3 :(得分:0)

谢谢,每个人我都明白我错过了什么我将==运算符添加到我的A类中,类似于:

bool A :: operator==(const A &t) const
{
return ( x == t.x && (strcmp(name, t.name) == 0) );
}

我按照 M3taSpl0it

的说法使用了我的getter和setter

就删除对象而言,它在find函数上起作用。