Заблокирован
|
|
1 | |
Контейнер, похожий на std::vector из C++16.02.2015, 20:30. Показов 3646. Ответов 17
Метки нет (Все метки)
скажите какой в шарпе контейнер наиболее похож на плюсовый вектор? вот вроде List (предчувствую сейчас скажут) он также дает динамическое изменение размера, доступ по индексу и т.п., но все таки ! List - переводится как список, а список это не массив ! элементы располагаются не линейно в памяти и т.п.
0
|
16.02.2015, 20:30 | |
Ответы с готовыми решениями:
17
Контейнер std::vector На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами Как передать целочисленную матрицу типа std::vector<std::vector<int> > в функцию? Ошибка: E2034 Cannot convert 'int' to 'std::vector<std::vector<TRabbitCell,std::allocator<TRabbitCell>>... |
Заблокирован
|
|
16.02.2015, 20:50 [ТС] | 3 |
а ближе что никакого нет? чтобы данные в памяти были последовательно расположены? все таки список это список... это не массив... а вектор он все таки реализует функционал динамического массива именно (для списка в stl есть конкретно list, deque и т.п.)
0
|
18 / 18 / 6
Регистрация: 21.12.2011
Сообщений: 72
|
|
16.02.2015, 20:55 | 4 |
На самом деле в C# нет чистых массивов как на плюсах. Даже примитивные типы, такие как int или double - это структуры.
Класс List - это удобная обертка, создающая иллюзию динамического массива (там идет работа с обычным массивом, который переопределяется с большей размерностью при необходимости). Добавлено через 2 минуты На сколько я знаю, массивы в C# (следовательно и List) располагают данные линейно.
0
|
Заблокирован
|
|
16.02.2015, 20:57 [ТС] | 5 |
ну это то я знаю
вы же знаете как организованы списки да? структура из двух указателей на предыдущий и следущий элементы и сами данные, т.е. просто в списке по идее должен быть более долгий доступ по индексу (пусть даже он возможен), для этого надо перебирать как минимум половину элементов, а в обычном массиве доступ по индексу достигается простым смещением указателя на нужное число байт Добавлено через 16 секунд видимо плохо знаете
0
|
Заблокирован
|
|
16.02.2015, 21:06 [ТС] | 7 |
не представляю в какой книге могут быть исходники шарповских контейнеров, я сужу лишь по тому как вообще идейно должны быть реализованы списки, если это не так, то видимо в шарпе они реализованы как то не так... ну по крайней мере не надо было называть этот контейнер списком если он реализован не как список...
0
|
16.02.2015, 21:15 | 8 |
Сообщение было отмечено Feaban как решение
Решение
Да, майкрософт немного пошутило когда назвали это List. На самом деле это динамический массив. Если вам нужен именно список - используйте LinkedList<T>
Хотя как на мой взгляд легче просто создать свой класс с Next и Prev.
1
|
Master of Orion
|
|
17.02.2015, 12:22 | 14 |
Ну эт да, я сначала тупанул, подумал про поиск нужного места для вставки (ведь нужно пройтись Head.Next.Next.Next...), короч ладно
А вот что Queue тоже на массиве не знал, честно говоря. Гораздо логичнее его делать именно на базе двусвязного списка имхо.
0
|
17.02.2015, 12:29 | 15 |
Но список требует существенный оврхед на ссылки.
А очередь легко реализуется на зацикленном массиве. Только увеличивать его иногда нужно конечно. А вот чего не хватает во фреймворке - так это ограниченного стека и ограниченнной очереди.
0
|
Master of Orion
|
|
17.02.2015, 12:39 | 16 |
Storm23, зависит от задачи. С другой стороны, никто не мешает написать свою мини-обертку над LinkedList<T> чтобы получить нужную очередь.
меня больше расстраивает тупость с интерфейсами, в частности ICollection<T> и IList<T>. Их нужно разделить на пяток различных, потому что ситуация, когда массив имплементирует IList<T>, но при попыкте вызвать почти любой метод выкидывает исключение, это довольно бредовая ситуация.
0
|
17.02.2015, 12:50 | 17 | ||||||||||
Да, IList мне тоже не нравится. Из-за того что там слишком много методов нужно реализовать. Причем 90% этих методов никто не вызывает.
Часто нужно сделать свой List (допустим нужны какие то операции при добавлении элементов), но реализовывать IList - лень. И тогда приходится писать либо
0
|
Master of Orion
|
|
17.02.2015, 12:58 | 18 |
Storm23, в этом плане в шестом шарпе хорошо - можно делегировать всё к внутреннему свойству (насколько я понял, всю эту писанину void Add(T item) { innerCol.Add(item); } наконец переложили на компилятор). Но тут вот например хорошо расписал парень:
0
|
17.02.2015, 12:58 | |
17.02.2015, 12:58 | |
Помогаю со студенческими работами здесь
18
Как изменять размер std::vector<std::vector>? Вывести значения std::vector<std::vector<int*> > Выделение памяти для вектора std::vector<iris> *v = new std::vector<iris> Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator> Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |