Найти, содержит ли std::list элемент из другого std::list

#c

#c

Вопрос:

У меня есть два списка:

 std::list<MyClass1> listClass1;
std::list<MyClass2> listClass2;
  

Для простоты предположим, что у них есть эти элементы:

 listClass1

{id: 1, name: "Test1"}
{id: 2, name: "Test2"}
{id: 3, name: "Test3"}
{id: 4, name: "Test4"}
{id: 5, name: "Test5"}

listClass2

{id: 1, name: "Test2"}
{id: 2, name: "Test5"}
  

Мне нужно выяснить, находится ли listClass2 name свойство в listClass1 name . Я имею в виду, если они совпадают. В противном случае возвращает ошибку или -1.

Есть ли более эффективный способ, чем повторное выполнение цикла дважды? Это все, о чем я мог думать на данный момент, поэтому любая помощь приветствуется.

Комментарии:

1. Если контейнеры отсортированы, вы можете использовать std::set_union .

Ответ №1:

Вы можете сохранить одно (большее из двух было бы лучше) имен списка в set<string> и выполнить итерацию по другому списку и посмотреть, содержит ли набор этот элемент.

Это должно сократить ваше время выполнения с O (m * n) до O (m * log (n)).

PS: Я считаю, что использование хэш-таблицы может еще больше уменьшить этот коэффициент log (n).

Комментарии:

1. std::unordered_set . Мы не заботимся о порядке; только о наличии.

2. Обязательно используйте unordered_set в этом случае, поскольку это обеспечит постоянный поиск по времени.