Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

внутренняя реализация STL vector

2.0K
31 мая 2007 года
A.D.I.D.A.S
52 / / 23.11.2004
подскажите кто знает как реализован STL класс вектор. вначала я ошибочно полагал что это связанные структуры данных наподобие списка, но потом прочитал что это не так
240
31 мая 2007 года
aks
2.5K / / 14.07.2006
Цитата: A.D.I.D.A.S
подскажите кто знает как реализован STL класс вектор. вначала я ошибочно полагал что это связанные структуры данных наподобие списка, но потом прочитал что это не так



Она может быть по разному реализованна. Есть только спецификация на интерфейс и на время выполнения операций.
А реализаций STL есть много.

1.8K
31 мая 2007 года
_const_
229 / / 26.11.2003
aks прав. Добавлю только, что конкретную реализацию можешь посмотреть в файле vector, который поставляется с твоим компилятором.
361
31 мая 2007 года
Odissey_
661 / / 19.09.2006
Данная тема на форуме уже обсуждалась (здесь). Стандартом от 2003 года гарантируется последовательное размещение.
350
05 июня 2007 года
cheburator
589 / / 01.06.2006
Ага, гарантируется последовательное размещение, гарантируется корректность итераторов, пока ты не добавляешь и не удаляешь элементы из вектора (модификация допустима). Особый случай: вектор bool.

Конкретная реализация может быть совершенно произвольной, лишь бы отвечала этим требованиям.
Как правило, реализуется просто как "избыточный" массив с динамическим размером, т. е. при выделении памяти для массива выделяем немного больше, чем затребовано, чтобы следующие операции вставки элемента не приводили нас к тому, что надо снова выделять новую память для массива и копировать все элементы из старого массива в новый.
В несколько упрощенном виде:
template <class A> class vector;
1. Имеем член-данные - указатель на динамический массив:
A *data;
2. Имеем актуальное количество элементов в массиве:
int _size;
3. Имеем выделенный размер массива:
int _allocated;
4. При вставке нового элемента проверяем, есть ли у нас еще "свободные места" в выделенном массиве (_size < _allocated);
5. Если свободные места есть - вызываем "размещающий" оператор new (displacement operator new) с копи-конструтором примерно так:
A *new_element = new (&data[_size]) A (ВставляемоеЗначение);
(напоминаю, это упрощенный вариант, иначе обратились бы к объекту-аллокатору);
6. Если места недостаточно (_size == _allocated), придется выделять новый массив и копировать туда старые данные. Но, как уже написано выше, лучше выделить сразу побольше места (скажем, 50% от существующего размера, т. е. _size/2, но не менее 1), таким образом, получим размер нового массива, равный _size + (_size-1) / 2 + 1. Естественно, ++_size и _allocated = _size + (_size-1) / 2 + 1.
Возможно, есть другие варианты, но не следует забывать прогарантировать последовательное размещение.
deque размещает элементы, как правило, более оптимально (стандарт этого не гарантирует!), но не подряд, но все же рекомендуется использовать deque, если не требуется последовательное размещение.
2.0K
06 июня 2007 года
A.D.I.D.A.S
52 / / 23.11.2004
благодарю!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог