c ++ Разница между двумя векторами & lt; MyType * & gt; A и B на основе строкового члена

У меня есть два векторных объекта с именами 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() сделать сравнение, но это не работает.

0

Решение

Добавить все записи b в задавать. Затем попробуйте добавить все записи a в этот набор — каждая запись, которая успешна, является записью, которая находится в a но не в b,

Если это Name записи, которые вы хотите сравнить, а не указатели, используйте set<string> и добавить Name записи к набору.

1

Другие решения

Это использует существующий алгоритм 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,

1

Это похоже на идеальную работу для set_difference ( http://www.cplusplus.com/reference/algorithm/set_difference/ ).

Предоставьте компаратор для ваших объектов, отсортируйте два вектора (используя этот компаратор), а затем используйте set_difference (используя тот же компаратор), чтобы получить объекты, которые находятся в первом, но не во втором.

-1
По вопросам рекламы [email protected]