powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Реализация List<t>
6 сообщений из 6, страница 1 из 1
Реализация List<t>
    #39221972
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гуглил, не получилось найти. Лист по идее это лист - то есть связный список. Тогда доступ по индексу занимает О(n). Но вроде как у List он занимает O(1). Получается что там устройство хитрое. Какое?
...
Рейтинг: 0 / 0
Реализация List<t>
    #39221979
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlЛист по идее это лист - то есть связный список. Тогда доступ по индексу занимает О(n). Но вроде как у List он занимает O(1). Получается что там устройство хитрое. Какое?
List<T> - это просто враппер на массивом, никакой связности там нет. Связный список - это LinkedList<T> (и в дотнете у него, кстати, нет своего собственного метода доступа по индексу).
FatherSqlгуглил, не получилось найти.
Лучше всего про это написано в исходниках .
...
Рейтинг: 0 / 0
Реализация List<t>
    #39222018
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нету чтоли добавления в середину?
...
Рейтинг: 0 / 0
Реализация List<t>
    #39222032
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавление в середину есть, но не быстрое. Похоже правда массив
тест
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
			const Int32 TEST = 100000;
			Console.WriteLine("Вставка в конец");
			var sw = Stopwatch.StartNew();
			var l = new List<Int32>();
			for(Int32 i = 0; i < TEST; i++) {
				l.Add(i);
			}
			Console.WriteLine(sw.ElapsedMilliseconds);
			Console.WriteLine("Вставка предпоследним");
			sw = Stopwatch.StartNew();
			l = new List<Int32>();
			l.Add(0);
			l.Add(1);
			for(Int32 i = 2; i < TEST; i++) {
				l.Insert(i - 1, i);
			}
			Console.WriteLine(sw.ElapsedMilliseconds);
			Console.WriteLine("Вставка вторым");
			sw = Stopwatch.StartNew();
			l = new List<Int32>();
			l.Add(0);
			l.Add(1);
			for(Int32 i = 2; i < TEST; i++) {
				l.Insert(1, i);
			}
			Console.WriteLine(sw.ElapsedMilliseconds);


РезультатВставка в конец
0 мс
Вставка предпоследним
2 мс
Вставка вторым
1546 мс
...
Рейтинг: 0 / 0
Реализация List<t>
    #39222049
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПохоже правда массив
Я же дал ссылку на исходник. Вот из потрохов реализации:
Код: c#
1.
private T[] _items;


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        public T this[int index] {
            get {
                // Following trick can reduce the range check by one
                if ((uint) index >= (uint)_size) {
                    ThrowHelper.ThrowArgumentOutOfRangeException();
                }
                Contract.EndContractBlock();
                return _items[index]; 
            }
 
            set {
                if ((uint) index >= (uint)_size) {
                    ThrowHelper.ThrowArgumentOutOfRangeException();
                }
                Contract.EndContractBlock();
                _items[index] = value;
                _version++;
            }
        }
...
Рейтинг: 0 / 0
Реализация List<t>
    #39222056
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныDima TПохоже правда массив
Я же дал ссылку на исходник. Вот из потрохов реализации:
Код: c#
1.
private T[] _items;


Сразу не глянул. Извиняюсь.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Реализация List<t>
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]