Форум программистов, компьютерный форум, киберфорум
Наши страницы

Перегрузка оператора индексации в списке - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ (void) в макросе define http://www.cyberforum.ru/cpp-beginners/thread863459.html
Добрый день! Разбираюсь со строкой: #define lua_readline(L,b,p) \ ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ Что...
C++ Игра Угадай Слово ошибка в коде Здравствуйте,проблема в том, что программа работает не корректно. А именно в начале программы при вводе "да" игра закрывается, хотя наоборот должна начаться. Помогите пожалуйста. Собственно вот код :... http://www.cyberforum.ru/cpp-beginners/thread863424.html
C++ Сравнение алгоритмов сортировки (выбором и пузырьком)
создать программу для сравнения алгоритмов сортировки (Выбором и Пузырьком)т.е. чтоб выдавал время построения массива.Помогите очень нужно.Желательно с объяснением.
Сравнить n-чисел и найти максимальное и минимальное значение, не прибегая к if C++
Надо сравнить n-чисел и найти максимальное и минимальное значение, не прибегая к ужасным разветлению оператора if?
C++ Рекурсивная структура http://www.cyberforum.ru/cpp-beginners/thread863390.html
Добрый день! Стоит задача написать односвязный список. Как все работает в общем я представляю, а конкретно я понимаю это так: имеем общую структуру элемента: struct List { int item; List...
C++ Сортировка Шелла Добрый день! Как сделать сортировку методом Шелла, если у меня числа в массив можно ввести и с клавиатуры и случайные числа. В массиве 100 элементов. register int i, j, gap, k; char x, a; ... подробнее

Показать сообщение отдельно
Убежденный
Ушел с форума
Эксперт С++
15701 / 7211 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
14.05.2013, 09:17
mappy89, с архитектурной точки зрения связный список вообще не должен иметь
оператора индексации и других методов, организующих произвольный доступ к содержимому.
Получение энного элемента - это крайне неэффективная операция, просто по причине
устройства связного списка: при каждом вызове выполняется цикл с проходом от начала
списка до нужного элемента. Просто подумайте, как это будет работать, если количество
элементов достигнет хотя бы нескольких тысяч.

Связный список, маскирующийся под обобщенный универсальный контейнер с произвольным
доступом - это "дырявая абстракция". Если требуется читать и записывать из середины,
лучше использовать другой контейнер, где индексация выполняется естественным образом.

C++
1
int &operator[](int);
Во-первых, вместо int в качестве индекса надежнее использовать так называемые memsize-типы.
Например, size_t или ptrdiff_t. Так вы расширяете теоретический максимум индекса, а
также страхуете себя от возможных проблем при переносе кода на 64-битные платформы.
Кроме того, использовать тип size_t и его псевдонимы для размеров - общепринятая практика.

Во-вторых, оператор индексации должен иметь две версии - обычную и const.
const-версия нужна, когда доступ к списку нужен только на чтение.
Например, функция, вычисляющая сумму всех элементов списка, не модифицирует его,
поэтому она может иметь следующую сигнатуру:
C++
1
int SumOfElements(my_list const &List);
Здесь в функцию будет передаваться константная ссылка на List - функции разрешается
вызывать только const-методы. Однако, если в классе my_list не определен const-оператор
индексации, попытка прочитать что-нибудь вызовет ошибку компиляции.

С учетом написанного, прототипы оператора индексации должны быть такими:
C++
1
2
int         operator [](size_t Index);          // Обычная версия.
int const & operator [](size_t Index) const;    // const-версия.
3
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru