Что такое C # эквивалент вектора C ++?
Я ищу эту функцию:
Чтобы иметь динамический массив непрерывно хранимой памяти, который не имеет потери производительности для доступа по сравнению со стандартными массивами.
Я искал и они говорят .NET equivalent to the vector in C++ is the ArrayList
так:
Есть ли у ArrayList функция непрерывной памяти?
Ответы:
Вы можете использовать,
List<T>
и когдаT
это тип значения, он будет выделен в непрерывной памяти, чего не было бы, если быT
это был ссылочный тип.Пример:
List<int> integers = new List<int>(); integers.Add(1); integers.Add(4); integers.Add(7); int someElement = integers[1];
источник
List<T>
класса содержит много примеров, но я обновил свой ответ, включив один.T
это ссылочный тип, у вас все равно будет непрерывная память. По сути, это массив указателей ...T[]
... OP запросил «отсутствие снижения производительности для доступа по сравнению со стандартными массивами» иList<T>
предоставляет это. И еслиT
это ссылочный тип, он аналогичен типуT*
C ++, поэтому вы получаете такую же непрерывность, как и в C ++. Если кто-то хочет, чтобы сами объекты были смежными, тогда, конечно, нужны типы значений ... на обоих языках. Разница, конечно же, в том, что в C ++ любой тип может использоваться как значение или ссылка, тогда как в C # это свойство типа через различие между классом и структурой.List<T>
что всегда реализован как связанный список внутри. Так как же тогда он динамически расширяется, когда мы звонимAdd()
? Что-то вроде VB6,Redim Preserve
который раньше копировал весь массив в новое место?List<T>
создает небольшой массивT[]
. Внутренние элементы добавляются в массив. Как только размер массива завершен, создается новый массив вдвое больше предыдущего. Данные копируются в новый больший массив, меньший уничтожается и так далее. Разработчик может дать намек на .NET , чтобы создать достаточно большой внутренний массив перед заполнением сList
помощью конструктора:new List<T>(expected_array_size)
.использовать
List<T>
. Внутри он использует массивы, а массивы используют непрерывную память.источник
private T[] _items;
используется для внутреннего хранилища, ссылочного типа или нет.Прежде всего, держитесь подальше от
Arraylist
илиHashtable
. Эти классы следует считать устаревшими в пользу универсальных. Они по-прежнему используются в языке для устаревших целей.Теперь то, что вы ищете, - это
List<T>
класс. Обратите внимание, что если T - тип значения, у вас будет непрерывная память, но не если T - ссылочный тип, по очевидным причинам.источник
В C # много ссылочных типов. Даже если в контейнере ссылки хранятся непрерывно, сами объекты могут быть разбросаны по куче.
источник
Похоже, что CLR / C # скоро получит лучшую поддержку Vector <>.
http://blogs.msdn.com/b/dotnet/archive/2014/04/07/the-jit-finally-proposed-jit-and-simd-are-getting-married.aspx
источник