KirillHelm
@KirillHelm

Как обратиться по индексу к списку C++?

Такой вопрос, нужно сделать в шарагу сортировку списков. К примеру классика, сортировка пузырьком, но что бы сортировать пузырьком, нужно уметь обратится к коллекции по индексу, а к list такое не прокатит. Следовательно у меня 2 вопроса:
1. Есть ли специальные модификации алгоритмов сортировки пузырьком, вставками, поиском для типа данных список?
2. Если нет и это полнейший бред, то как обращаться к списку, а конкретно list в C++ по индексу?

Мне сразу пришло в голову просто наследоваться от лист и переопределить там оператор взятия по индексу:
template <class T>
class mylist : public list<T>
{
public:
	T operator[](int index)
	{
		mylist<T>::iterator im;
		for (im = this->begin(), int i = 0; i < index; i++)
		{
			im++;
			if (im == this->end())
			{
				break;
			}
		}
		return im;
	}
};

Но тут возникает конфликт при выводе:
mylist<int> *lk = new mylist<int>();
	for (int i = 0; i < 10; i++)
	{
		lk->insert(lk->begin(), i);
	}
	cout << &lk[3] << endl;

Но выводит я так понимаю, оно адрес ячейки памяти (собственно говоря, я понимаю почему если смотреть только на '&', но если учесть, что по идее возвращается итератор, не представляю как это вообще работает), вопрос теперь, как эту всю красоту переработать, так как без операции взятия адреса эта гадость не хочет работать и выплёвывает: E0349 и C2679.
Благодарю за помощь.
  • Вопрос задан
  • 1915 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
std::list — связанный список. Адреса там не обязательно соседние. Не надо с адресами работать! Надо работать именно что с итераторами — они действуют как указатели, только не на непрерывном буфере, а на списке непонятно какого устройства.

Операцию [] не наладили намеренно: она там O(n). И если вы с такой сложностью через эту операцию наладите быструю, она будет O(n² log n). В то время как пузырёк, учитывающий специфику связного списка,— O(n²). А ведь на двусвязном списке при желании можно написать и быструю. Я писал.

И не только я: у std::list есть свой sort: ru.cppreference.com/w/cpp/container/list/sort
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Советую попробовать реализовать сортировку слиянием, и самом написать класс/структуру списка. Это отличное упражнение, чтобы понять как работает популярный алгоритм сортировки и разобраться со списками.
Возможно это напрямую не пригодится вам в работе, но выправит мышление (а вот это уже пригодится!) и позволит пройти собеседования в более-менее серьезные компании. На собеседованиях обычно бывает от одной до нескольких алгоритмических задач.
Ответ написан
@nirvimel
bubble sort on linked list
На то он и Пузырек, что не нужен там доступ по индексу.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы