Я пытаюсь использовать реализацию связанного списка, чтобы изменить другой связанный список.
Вот пример того, что я пытаюсь сделать.
list<int>list1;
list<int>list2;
list1.push_back( 1 ); // < --- want to modify this list
list1.push_back( 2 );
list2.push_back( 1 ); // with this list
Короче говоря, я хочу использовать list2 как своего рода переменную для изменения list1. Я провел некоторые исследования, похоже, я не могу получить доступ к узлам списка, как массив. Есть ли контейнер, который позволяет мне легко добавлять и удалять узлы, сравнивать и изменять его с другими контейнерами? Я думал, что наборы могут быть альтернативой, но кажется, что я также не могу получить доступ к значениям в наборе. Любая помощь или свидетельство было бы здорово. Заранее спасибо.
РЕДАКТИРОВАТЬ:::
Я ищу, чтобы создать решение судоку. Я поместил все 81 цифру (пустую и указанную) в «связанный список». Я сейчас ищу, чтобы удалить возможных кандидатов из каждого «списка», который представляет 1 ячейку.
Например
listlist1;
listlist2;
list1.push_back( 1 );
list1.push_back( 2 );
list2.push_back( 1 );
Теперь я хочу использовать list2, как это
list1.remove( list2(?) ); // < -- this obviously isn't possible due to how nodes are stored.
Надеюсь, это немного прояснит мой вопрос. Это способ, которым я использую для решения простых судоку, и позже я реализую технику грубой силы.
Вот один из способов, без сомнения, есть и другие. Это зависит от того, каковы ваши обстоятельства. Например, если ваши списки отсортированы, есть лучший способ, чем этот.
list<int> list1 = ...;
list<int> list2 = ...;
for (list<int>::const_iterator i = list2.begin(); i != list2.end(); ++i)
list1.remove(*i);
Я не знаю, что вы думаете о модификации контейнера с другим, возможно, вы имели в виду ссылку. Используйте его в качестве ссылочной переменной:
list<int> list1;
list<int>& list2 = list1;
list2.push_back(1); //<--- modifies list1
Или используйте указатель:
list<int> list1;
list<int>* list2 = &list1;
list2->push_back(1); //<--- modifies list1
Читайте о указателях Вот
Поскольку ваши списки не слишком длинные, я думаю, используя list::remove_if()
Ваша лучшая ставка здесь.
Используйте вспомогательную функцию:
bool IsInList2(int el)
{
return std::find(list2.begin(), list2.end(), el) != list2.end();
}
и используйте его в своем коде:
list1.remove_if(&IsInList2);