У меня есть два векторных объекта с именами A и B. Класс MyType не иметь идентификатор поля, и я хочу получить MyType *, которые находятся в A, но не в B.
Так как у меня нет идентификатора, нужно сравнивать на основе строкового поля.
Класс моего объекта выглядит следующим образом
class Object
{
public:
Object();
string Name;
bool Mode;
string something;
Int range;
}vector<Object*> a; //asssume filled with objects
vector<Object*> b; //asssume filled with objects
vector<Object*> ret;
Теперь я хочу получить разницу (a,b)
— все члены, которые находятся в a, а не b.
Как поступить на этом. Я пытаюсь использовать strcmp()
сделать сравнение, но это не работает.
Добавить все записи b
в задавать. Затем попробуйте добавить все записи a
в этот набор — каждая запись, которая успешна, является записью, которая находится в a
но не в b
,
Если это Name
записи, которые вы хотите сравнить, а не указатели, используйте set<string>
и добавить Name
записи к набору.
Это использует существующий алгоритм STL:
bool compPtrByName(Object *const &p1, Object *const &p2) {
return p1->Name < p2->Name;
}
а затем позвоните
std::sort(a.begin(), a.end(), compPtrByName);
std::sort(b.begin(), b.end(), compPtrByName);
std::set_difference(a.begin(), a.end(), b.begin(), b.end(), ret.begin(), compPtrByName);
Если переупорядочение векторов не разрешено, сначала скопируйте их.
Замечания: Это дает разность множеств A — B. Для объединения симметричной разности (A — B) (B — A) используйте std::set_symmetric_difference
,
Это похоже на идеальную работу для set_difference
( http://www.cplusplus.com/reference/algorithm/set_difference/ ).
Предоставьте компаратор для ваших объектов, отсортируйте два вектора (используя этот компаратор), а затем используйте set_difference
(используя тот же компаратор), чтобы получить объекты, которые находятся в первом, но не во втором.