Вектор (Vector)
Вектор (Vector)
vector - вид последовательности, которая поддерживает итераторы произвольного доступа. Кроме того, он поддерживает операции вставки и удаления в конце с постоянным (амортизированным) временем; вставка и удаление в середине занимают линейное время. Управление памятью обрабатывается автоматически, хотя для улучшения эффективности можно давать подсказки.
template ‹class T, template ‹class U› class Allocator = allocator›
class vector {
public:
// определения типов (typedefs):
typedef iterator;
typedef const_iterator;
typedef Allocator‹T›::pointer pointer;
typedef Allocator‹T›::reference reference;
typedef Allocator‹T›::const_reference const_reference;
typedef size_type;
typedef difference_type;
typedef T value_type;
typedef reverse_iterator;
typedef const_reverse_iterator;
// размещение/освобождение (allocation/deallocation):
vector();
vector(size_type n, const T& value = T());
vector(const vector‹T, Allocator›& x);
template ‹class InputIterator›
vector(InputIterator first, InputIterator last);
~vector();
vector‹T, Allocator›& operator=(const vector‹T, Allocator›& x);
void reserve(size_type n);
void swap(vector‹T, Allocator›& x);
// средства доступа (accessors):
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rend();
size_type size() const;
size_type max_size() const;
size_type capacity() const;
bool empty() const;
reference operator[](size_type n);
const_reference operator[](size_type n) const;
reference front();
const_reference front() const;
reference back();
const_reference back() const;
// вставка/стирание (insert/irase):
void push_back(const T& x);
iterator insert(iterator position, const T& x = T());
void insert(iterator position, size_type n, const T& x);
template ‹class InputIterator›
void insert(iterator position, InputIterator first, InputIterator last);
void pop_back();
void erase(iterator position);
void erase(iterator first, iterator last);
};
template ‹class T, class Allocator›
bool operator==(const vector‹T, Allocator›& x, const vector‹T, Allocator›& y);
template ‹class T, class Allocator›
bool operator‹(const vector‹T, Allocator›& x, const vector‹T, Allocator›& y);
iterator - это итератор произвольного доступа, ссылающийся на T. Точный тип зависит от исполнения и определяется в Allocator.
const_iterator - это постоянный итератор произвольного доступа, ссылающийся на const T. Точный тип зависит от исполнения и определяется в Allocator. Гарантируется, что имеется конструктор для const_iterator из iterator.
size_type - беззнаковый целочисленный тип. Точный тип зависит от исполнения и определяется в Allocator.
difference_type - знаковый целочисленный тип. Точный тип зависит от исполнения и определяется в Allocator.
Конструктор template ‹class InputIterator› vector(InputIterator first, InputIterator last) делает только N вызовов конструктора копирования T (где N - расстояние между first и last) и никаких перераспределений, если итераторы first и last относятся к последовательной, двунаправленной или произвольного доступа категориям. Он делает, самое большее, 2N вызовов конструктора копирования T и logN перераспределений, если они - только итераторы ввода, так как невозможно определить расстояние между first и last и затем сделать копирование.
Функция-член capasity (ёмкость) возвращает размер распределённой памяти в векторе. Функция-член reserve - директива, которая сообщает vector (вектору) запланированноe изменение размера, так чтобы он мог соответственно управлять распределением памяти. Это не изменяет размер последовательности и занимает, самое большее, линейное время от размера последовательности. Перераспределение в этом случае происходит тогда и только тогда, когда текущая ёмкость меньше, чем параметр reserve. После reserve ёмкость (capasity) больше или равна параметру reserve, если происходит перераспределение; а иначе равна предыдущему значению capasity. Перераспределение делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что нет никакого перераспределения во время вставок, которые происходят после того, как reserve выполняется, до времени, когда размер вектора достигает размера, указанного reserve.
insert (вставка) вызывает перераспределение, если новый размер больше, чем старая ёмкость. Если никакого перераспределения не происходит, все итераторы и ссылки перед точкой вставки остаются справедливыми. Вставка единственного элемента в вектор линейна относительно расстояния от точки вставки до конца вектора. Амортизированная сложность во время жизни вектора, вставляющего единственный элемент в свой конец, постоянна. Вставка множественных элементов в вектор с единственным вызовом вставляющей функции-члена линейна относительно суммы числа элементов плюс расстояние до конца вектора. Другими словами, намного быстрее вставить много элементов в середину вектора сразу, чем делать вставку по одному элементу. Шаблонная вставляющая функция-член предраспределяет достаточно памяти для вставки, если итераторы first и last относятся к последовательной, двунаправленной или произвольного доступа категориям. Иначе функция вставляет элементы один за другим и не должна использоваться для вставки в середину векторов.
erase (стирание) делает недействительными все итераторы и ссылки после пункта стирания. Деструктор T вызывается столько раз, каково число стёртых элементов, а оператор присваивания T вызывается столько раз, каково число элементов в векторе после стёртых элементов.
Чтобы оптимизировать распределение места, даётся определение для bool.
class vector‹bool, allocator› {
public:
// битовая ссылка (bit reference):
class reference {
public:
~reference();
operator bool() const;
reference& operator=(const bool x);
void flip(); // инвертирует бит (flips the bit)
};
// определения типов (typedefs):
typedef bool const_reference;
typedef iterator;
typedef const_iterator;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef bool value_type;
typedef reverse_iterator;
typedef const_reverse_iterator;
// размещение/освобождение (allocation/deallocation):
vector();
vector(size_type n, const bool& value = bool());
vector(const vector‹bool, allocator›& x);
template ‹class InputIterator›
vector(InputIterator first, InputIterator last);
~vector();
vector‹bool, allocator›& operator=(const vector‹bool, allocator›& x);
void reserve(size_type n);
void swap(vector‹bool, allocator›& x);
// средства доступа (accessors):
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rend();
size_type size() const;
size_type max_size() const;
size_type capacity() const;
bool empty() const;
reference operator[](size_type n);
const_reference operator[](size_type n) const;
reference front();
const_reference front() const;
reference back();
const_reference back() const;
// вставка/стирание (insert/irase):
void push_back(const bool& x);
iterator insert(iterator position, const bool& x = bool());
void insert(iterator position, size_type n, const bool& x);
template ‹class InputIterator›
void insert(iterator position, InputIterator first, InputIterator last);
void pop_back();
void erase(iterator position);
void erase(iterator first, iterator last);
};
void swap(vector‹bool, allocator›::reference x, vector‹bool, allocator›::reference y);
bool operator==(const vector‹bool, allocator›& x, const vector‹bool, allocator›& y);
bool operator‹(const vector‹bool, allocator›& x, const vector‹bool, allocator›& y);
reference - класс, который имитирует поведение ссылок отдельного бита в vector‹bool›.
Ожидается, что каждое исполнение обеспечит определение vector‹bool› для всех поддерживаемых моделей памяти.
Сейчас невозможно шаблонизировать определение. То есть мы не можем написать:
template ‹template ‹class U› class Allocator = allocator›
class vector‹bool, Allocator› {/*… */};
Поэтому обеспечивается только vector‹bool, Allocator›.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
76. По умолчанию используйте vector . В противном случае выбирайте контейнер, соответствующий задаче
76. По умолчанию используйте vector. В противном случае выбирайте контейнер, соответствующий задаче РезюмеОчень важно использовать "правильный контейнер". Если у вас есть весомые причины выбрать определенный тип контейнера, используйте тот контейнер, который наиболее
77. Вместо массивов используйте vector и string
77. Вместо массивов используйте vector и string РезюмеИзбегайте реализации абстракция массива посредством массивов в стиле С, арифметики указателей и примитивов управления памятью. Использование vector или string не только сделает проще вашу жизнь, но и позволит написать более
78. Используйте vector (и string::c_str ) для обмена данными с API на других языках
78. Используйте vector (и string::c_str) для обмена данными с API на других языках Резюмеvector и string::c_str служат шлюзом для сообщения с API на других языках. Однако не полагайтесь на то, что итераторы являются указателями; для получения адреса элемента, на который ссылается vector<T>::iterator
6.2. Эффективное использование vector
6.2. Эффективное использование vector ПроблемаВы используете vector, и при этом имеются жесткие требования по объему или времени выполнения кода и требуется снизить или устранить все накладные расходы.РешениеПоймите, как реализован vector, узнайте о сложности методов вставки и
Контейнеры vector и string
Контейнеры vector и string Все контейнеры STL по-своему полезны, однако большинство программистов С++ работает с vector и string чаще, чем с их собратьями, и это вполне понятно. Ведь контейнеры vector и string разрабатывались как замена массивов, а массивы настолько полезны и удобны, что
Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса
Совет 16. Научитесь передавать данные vector и string функциям унаследованного интерфейса С момента стандартизации С++ в 1998 году элита С++ настойчиво подталкивает программистов к переходу с массивов на vector. Столь же открыто пропагандируется переход от указателей char* к объектам
Совет 18. Избегайте vector<bool>
Совет 18. Избегайте vector<bool> Vector<bool> как контейнер STL обладает лишь двумя недостатками. Во-первых, это вообще не контейнер STL. Во-вторых, он не содержит bool.Объект не становится контейнером STL только потому, что кто-то назвал его таковым — он становится контейнером STL лишь
2.8. Стандартный массив - это вектор
2.8. Стандартный массив - это вектор Хотя встроенный массив формально и обеспечивает механизм контейнера, он, как мы видели выше, не поддерживает семантику абстракции контейнера. До принятия стандарта C++ для программирования на таком уровне мы должны были либо
3.10. Класс vector
3.10. Класс vector Использование класса vector (см. раздел 2.8) является альтернативой применению встроенных массивов. Этот класс предоставляет гораздо больше возможностей, поэтому его использование предпочтительней. Однако встречаются ситуации, когда не обойтись без
6.2. Вектор или список?
6.2. Вектор или список? Первая задача, которую должна решить наша программа, – это считывание из файла заранее неизвестного количества слов. Слова хранятся в объектах типа string. Возникает вопрос: в каком контейнере мы будем хранить слова – в последовательном или
6.3. Как растет вектор?
6.3. Как растет вектор? Вектор может расти динамически. Как это происходит? Он должен выделить область памяти, достаточную для хранения всех элементов, скопировать в эту область все старые элементы и освободить ту память, в которой они содержались раньше. Если при этом
14.4.2. Вектор объектов
14.4.2. Вектор объектов Когда определяется вектор из пяти объектов класса, например:vector Point vec( 5 );* то инициализация элементов производится в следующем порядке5: С помощью конструктора по умолчанию создается временный объект типа класса, хранящегося в векторе.* К каждому
КОСМОС: Красный вектор: Что нового мы узнали о Марсе за последние десят лет?
КОСМОС: Красный вектор: Что нового мы узнали о Марсе за последние десят лет? Автор: Александр БумагинС тех пор как переводчики переврали смысл работы Скиапарелли, разместив на Марсе рукотворные каналы, разговоры об этой планете не утихают. Голубая мечта о братьях по
7 февраля 2014 года — день истины, определивший вектор самосовершенствования Сергей Голубицкий
7 февраля 2014 года — день истины, определивший вектор самосовершенствования Сергей Голубицкий Опубликовано 07 февраля 2014 На сегодня у меня была запланирована бомба, потенциал которой я попытался вложить в название — «Окончательный вердикт по