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