Искать значение, а затем удалять содержащий его объект из массива объектов?

#c #vector #find

#c #вектор #Найти

Вопрос:

 #include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class A
{
      public :
      void getData(vector< A > amp;);
      void putData(vector< A > amp;);

      private :
              int x;
              char name[90];
};
vector< A > v;

void A :: getData(vector< A > amp;Aref)
{
     cout << "id = ";
     cin >> x;
     cout << "nname = ";
     cin >> name;

}

void A :: putData(vector< A > amp;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) из массива объектов, а затем удалить этот объект.

Пожалуйста, посоветуйте?

Ответ №1:

Мой совет:

  1. Упростить. Вы могли бы воспроизвести эту ошибку с гораздо меньшим кодом.
  2. Опубликуйте сообщения об ошибках. Этот код не выдает ошибку, он не компилируется.
  3. Прочитайте сообщения об ошибках. В вашем классе `A` отсутствует оператор равенства (`operator ==`), поэтому `find` не может воздействовать на него — как он может узнать, когда найдено соответствие?
  4. Проверяйте детали по мере их добавления. Вы должны были перехватить `v[0].putData(v)` еще до того, как попытались `find`.
  5. Научитесь делать что-то вручную, прежде чем пытаться автоматизировать их. Если бы вы попытались найти и удалить `v[1]` с помощью цикла, прежде чем пытаться использовать `find`, все это было бы понятно.
  6. Если вы хотите выполнять более тонкие вещи, такие как поиск по различным атрибутам, вам придется либо самостоятельно писать циклы, либо изучить более тонкие инструменты, такие как функторы `remove` и `find_if`. Угадайте, какой из них, я думаю, вам следует изучить в первую очередь.
  7. РЕДАКТИРОВАТЬ: Протестируйте итераторы, прежде чем пытаться их стереть. Если вы не понимаете, почему это важно, вы недостаточно изучили итераторы.

Ответ №2:

Зачем вам это делать, функции получения и установки не должны быть такими, должны быть:

 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; 
  

Ответ №3:

То, что вы, похоже, ищете, — это не std::find, а std::find_if . Вот пример.

Ответ №4:

Спасибо всем, я понимаю, чего мне не хватало, я добавил оператор == в свой класс A, который выглядит примерно так :

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

и я использовал свои методы получения и установки, как указано в M3taSpl0it

Это сработало с функцией find в том, что касается удаления объекта.