I. Что такое vector?

vector — это последовательный контейнер, который инкапсулирует массив динамического размера. Как и любой другой тип контейнера, он может хранить объекты различных типов. Его можно просто рассматривать как динамический массив, который может хранить элементы любого типа.


II. Характеристики контейнера

1. Упорядоченная последовательность

Элементы в контейнере-последовательности располагаются в строгом линейном порядке. Доступ к соответствующему элементу можно получить по его позиции в последовательности.

2. Динамический массив

Поддерживает быстрый прямой доступ к любому элементу в последовательности, и это можно сделать даже с помощью арифметики указателей. Обеспечивает относительно быстрое добавление/удаление элементов в конце последовательности.

3. С поддержкой аллокатора

Контейнер использует объект-аллокатор для динамического управления своими потребностями в памяти.


III. Реализация основных функций

1. Конструкторы
  • vector(): создаёт пустой vector
  • vector(int nSize): создаёт vector с nSize элементами
  • vector(int nSize, const t& t): создаёт vector с nSize элементами, все со значением t
  • vector(const vector&): конструктор копирования
  • vector(begin,end): копирует элементы из другого массива в диапазоне [begin,end) в вектор

2. Функции добавления

  • void push_back(const T& x): добавляет элемент X в конец вектора
  • iterator insert(iterator it, const T& x): вставляет элемент x в вектор перед элементом, на который указывает итератор
  • iterator insert(iterator it, int n, const T& x): вставляет n одинаковых элементов x в вектор перед элементом, на который указывает итератор
  • iterator insert(iterator it, const_iterator first, const_iterator last): вставляет в вектор данные из другого вектора того же типа в диапазоне [first,last) перед элементом, на который указывает итератор

3. Функции удаления

  • iterator erase(iterator it): удаляет из вектора элемент, на который указывает итератор
  • iterator erase(iterator first, iterator last): удаляет из вектора элементы в диапазоне [first,last)
  • void pop_back(): удаляет последний элемент в векторе
  • void clear(): очищает все элементы в векторе

4. Функции обхода

  • reference at(int pos): возвращает ссылку на элемент в позиции pos
  • reference front(): возвращает ссылку на первый элемент
  • reference back(): возвращает ссылку на последний элемент
  • iterator begin(): возвращает указатель на начало вектора, указывающий на первый элемент
  • iterator end(): возвращает указатель на конец вектора, указывающий на позицию после последнего элемента
  • reverse_iterator rbegin(): обратный итератор, указывающий на последний элемент
  • reverse_iterator rend(): обратный итератор, указывающий на позицию перед первым элементом

5. Функции проверки

  • bool empty() const: определяет, пуст ли вектор; если пуст, в векторе нет элементов

6. Функции размера

  • int size() const: возвращает количество элементов в векторе
  • int capacity() const: возвращает максимальное количество элементов, которое текущий vector может содержать
  • int max_size() const: возвращает максимально допустимое количество элементов в vector

7. Другие функции

  • void swap(vector&): обменивает данные двух vector одного типа
  • void assign(int n, const T& x): устанавливает значения первых n элементов в vector равными x
  • void assign(const_iterator first, const_iterator last): устанавливает элементы в vector равными элементам в [first,last)

8. Для ясности

1. push_back: добавляет элемент данных в конец массива

2. pop_back: удаляет последний элемент данных из массива

3. at: возвращает данные по позиции с номером

4. begin: возвращает указатель на начало массива

5. end: возвращает указатель на позицию после последнего элемента массива

6. front: получает ссылку на начало массива

7. back: получает ссылку на последний элемент массива

8. max_size: получает максимально возможный размер вектора

9. capacity: текущий выделенный размер вектора

10. size: размер используемых в данный момент данных

11. resize: изменяет размер используемых в данный момент данных; если он больше текущего использования, заполняет их значениями по умолчанию

12. reserve: изменяет размер пространства, выделенного в данный момент для вектора

13. erase: удаляет элемент данных, на который указывает указатель

14. clear: очищает текущий вектор

15. rbegin: возвращает указатель начала обратного вектора (фактически, исходный end - 1)

16. rend: возвращает указатель конца обратного вектора (фактически, исходный begin - 1)

17. empty: определяет, пуст ли вектор

18. swap: обменивается данными с другим вектором


IV. Базовое использование

#include < vector> 
using namespace std;

V. Краткое введение

  1. Vector<type> идентификатор
  2. Vector<type> идентификатор(максимальная вместимость)
  3. Vector<type> идентификатор(максимальная вместимость, начальные значения всех элементов)
  4. Int i[5]={1,2,3,4,5}
    Vector<type> vi(I, i+2); // получить значение после того, как значение индекса i равно 3
  5. Vector< vector< int> >v; // двумерный вектор. Примечание: внешние <> должны иметь пробел; иначе он не скомпилируется на старых компиляторах.

Пример

1. pop_back() & push_back(elem) пример: удаление и вставка данных в конце контейнера

Пример

#include <string.h> #include <vector> #include <iostream> using namespace std; int main() { vector<int>obj;// создать контейнер для хранения vector int for(int i=0;i<10;i++) // push_back(elem) добавляет данные в конец массива { obj.push_back(i); cout<<obj[i]<<","; } for(int i=0;i<5;i++)// удаляет последний элемент данных из массива { obj.pop_back(); } cout<<"\n"<<endl; for(int i=0;i<obj.size();i++)// size(): фактическое количество элементов данных в контейнере { cout<<obj[i]<<","; } return 0; }

Результат вывода:

0,1,2,3,4,5,6,7,8,9,

0,1,2,3,4,

2. clear() очищает все данные в контейнере

Пример

#include <string.h> #include <vector> #include <iostream> using namespace std; int main() { vector<int>obj; for(int i=0;i<10;i++)// push_back(elem) добавляет данные в конец массива { obj.push_back(i); cout<<obj[i]<<","; } obj.clear();// очистить все данные в контейнере for(int i=0;i<obj.size();i++) { cout<<obj[i]<<endl; } return 0; }

Результат вывода:

0,1,2,3,4,5,6,7,8,9,

3. Сортировка

Пример

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int>obj; obj.push_back(1); obj.push_back(3); obj.push_back(0); sort(obj.begin(),obj.end());//От меньшего к большему cout<<"От меньшего к большему:"<<endl; for(int i=0;i<obj.size();i++) { cout<<obj[i]<<","; } cout<<"\n"<<endl; cout<<"От большего к меньшему:"<<endl; reverse(obj.begin(),obj.end());//От большего к меньшему for(int i=0;i<obj.size();i++) { cout<<obj[i]<<","; } return 0; }

Результат вывода:

从小到大:
0,1,3,

从大到小:
3,1,0,

1. Обратите внимание, что sort требует заголовочного файла#include <algorithm>

2. Если вы хотите, чтобы sort сортировал по убыванию, можно переписать sort

bool compare(int a,int b) 
{ 
    return a< b; //升序排列,如果改为return a>b,则为降序 
} 
int a[20]={2,4,1,23,5,76,0,43,24,65},i; 
for(i=0;i<20;i++) 
    cout<< a[i]<< endl; 
sort(a,a+20,compare);

4. Доступ (прямой доступ к массиву & доступ через итераторы)

Пример

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { //Последовательный доступ vector<int>obj; for(int i=0;i<10;i++) { obj.push_back(i); } cout<<"Прямое использование массивов:"; for(int i=0;i<10;i++)//Способ 1 { cout<<obj[i]<<" "; } cout<<endl; cout<<"Использование итераторов:" ; //Способ 2, использование итераторов для вывода данных из контейнера vector<int>::iterator it;//Объявление итератора для доступа к контейнеру vector, используется для: обхода или указания на элементы контейнера vector for(it=obj.begin();it!=obj.end();it++) { cout<<*it<<" "; } return 0; }

Результат вывода:

直接利用数组:0 1 2 3 4 5 6 7 8 9 
利用迭代器:0 1 2 3 4 5 6 7 8 9

5. Два способа определения двумерного массива (одинаковый результат)

Способ 1

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { int N=5, M=6; vector<vector<int> > obj(N); //Определение двумерного динамического массива с 5 строками for(int i =0; i< obj.size(); i++)//Динамический двумерный массив с 5 строками и 6 столбцами, все значения равны 0 { obj[i].resize(M); } for(int i=0; i< obj.size(); i++)//Вывод двумерного динамического массива { for(int j=0;j<obj[i].size();j++) { cout<<obj[i][j]<<" "; } cout<<"\n"; } return 0; }

Способ 2

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { int N=5, M=6; vector<vector<int> > obj(N, vector<int>(M)); //Определить двумерный динамический массив с 5 строками и 6 столбцами for(int i=0; i< obj.size(); i++)//Вывод двумерного динамического массива { for(int j=0;j<obj[i].size();j++) { cout<<obj[i][j]<<" "; } cout<<"\n"; } return 0; }

Результат вывода:

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 

Исходный адрес: http://blog.csdn.net/w_linux/article/details/71600574