Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: реализация контейнера вектор.  (Прочитано 9052 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 20-01-2014 07:20 » 

В С нет STL -библиотеки, тем более интересна для практических целей реализация контейнера вектор.
Прочитав дискуссии в инете, понял ,что вектор это логическая структура,  определяемая неким интерфейсом т.е. это  - получение доступа к ее единицам данных по индексу, операции вставки и удаления, с перевыделением и частичной очисткой памяти, а также полная очистка - метод clear.  Программная реализация может быть разной. Как понимаю на основе списков односвязных или двухсвязных или динамических массивов.
Как грамотнее и проще всего в С  сделать реализацию контейнера вектор?
т.е мне кажется на основе списка, но доступ по индексу тогда как делать?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 20-01-2014 08:20 » 

eugrita, почему на основе списка? В STL в основе вектора всегда непрерывный отрезок памяти (массив), просто содержимое копируется при переаллокации. Собственно, непрерывностью своей он и ценен, для всего остального есть другие контейнеры (дек, лист, сет).
И, кстати, почему списочная или блочная структура (как у list или deque) должна служить непреодолимым препятствием для доступа по индексу?
« Последнее редактирование: 20-01-2014 08:26 от Вад » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 20-01-2014 08:58 » 

В добавок, В С++ контейнеры реализованы на шаблонах (template). Насколько я знаю, такого понятия в чистом С не сушествует. Так что, скорее всего, чтобы реализовать типонезависимость, нужно будет очень много применять макросы.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 20-01-2014 09:53 » 

Finch, можно просто хранить размер элемента - это, всё-таки, C, за каст к void* и арифметику указателей никто не осудит Улыбаюсь Но возврат по значению так не сделать, согласен.
А при желании - да, можно и свой "шаблонный" вектор сделать, конечно. У нас в одной конторе был любитель, о нём легенды ходили - он, не доверяя С++ и STL, пользовался в C++-коде самописным ООП на макросах, с обработкой исключений, контейнерами и всем прочим Улыбаюсь
« Последнее редактирование: 20-01-2014 09:57 от Вад » Записан
darkelf
Молодой специалист

ua
Offline Offline

« Ответ #4 : 21-01-2014 06:41 » new

eugrita, для реализации самописного вектора на C, можно воспользоваться обычными malloc() и realloc(), которые можно обернуть в более менее удобный интерфейс. Я реализовывал нечто подобное, если интересно - могу поделиться, но думаю, что в сети такого добра хватает.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines