#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
в этом случае, поскольку это обеспечит постоянный поиск по времени.