vector
向量(Vector
)是一个封装了动态大小数组的顺序容器,会根据插入和删除元素自动调整容器大小。Vector
中的元素是被连续存储的,所以能够进行访问和迭代。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。从Vector
尾部删除元素是常量时间,在Vector
头部或者中间插入和删除元素是线性时间
容器特性
- 顺序序列
顺序容器中的元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问对应的元素
- 动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作
- 能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求
基本函数
- 构造函数
vector(): 创建一个空vector
vector(int nSize): 创建一个vector,元素个数为nSize
vector(int nSize,const t& t): 创建一个vector,元素个数为nSize,且值均为t
vector(const vector&): 复制构造函数
vector(begin,end): 复制[begin,end)区间内另一个数组的元素到vector中
- 增加函数
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)间的数据
- 删除函数
iterator erase(iterator it): 删除向量中迭代器指向元素
iterator erase(iterator first,iterator last): 删除向量中[first,last)中元素
void pop_back(): 删除向量中最后一个元素
void clear(): 清空向量中所有元素
- 遍历函数
reference at(int pos): 返回pos位置元素的引用
reference front(): 返回首元素的引用
reference back(): 返回尾元素的引用
iterator begin(): 返回向量头指针,指向第一个元素
iterator end(): 返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin(): 反向迭代器,指向最后一个元素
reverse_iterator rend(): 反向迭代器,指向第一个元素之前的位置
- 判断函数
bool empty() const: 判断向量是否为空,若为空,则向量中无元素
- 大小函数
int size() const: 返回向量中元素的个数
int capacity() const: 返回当前向量所能容纳的最大元素值
int max_size() const: 返回最大可允许的vector元素数量值
void resize(int n): 缩放向量到指定大小
void resize(int n, int val): 缩放向量到指定大小并指定新元素值
void shrink_to_fit(); 减少向量的capacity来适应size大小
- 其他函数
void swap(vector&): 交换两个同类型向量的数据
void assign(int n,const T& x): 设置向量中第n个元素的值为x
void assign(const_iterator first,const_iterator last): 向量中[first,last)中元素设置成当前向量元素
基本用法
- 遍历vector
#include <iostream>
#include <vector>
using namespace std;
void iteratorVector() {
vector<int> vector;
for (int i = 1; i <= 5; i++)
vector.push_back(i);
cout << "output begin and end: ";
for (auto i = vector.begin(); i != vector.end() ; ++i)
cout << *i<<" ";
cout <<"\noutput of cbegin and cend: ";
for (auto i = vector.cbegin(); i != vector.cend(); ++i)
cout << *i << " ";
cout << "\noutput of rbegin and rend: ";
for (auto ir = vector.rbegin(); ir != vector.rend(); ++ir)
cout << *ir << " ";
cout << "\noutput of crbegin and crend : ";
for (auto ir = vector.crbegin(); ir != vector.crend(); ++ir)
cout << *ir << " ";
}
int main(int argc, const char * argv[]) {
iteratorVector();
return 0;
}
运行输出
output begin and end: 1 2 3 4 5
output of cbegin and cend: 1 2 3 4 5
output of rbegin and rend: 5 4 3 2 1
output of crbegin and crend : 5 4 3 2 1
- vector容量
void vectorCapacity() {
vector<int> vector;
for (int i = 1; i <= 5; i++)
vector.push_back(i);
cout << "size: "<< vector.size()<<endl;
cout << "capacity: "<< vector.capacity()<<endl;
cout << "max_size: "<< vector.max_size()<<endl;
// resizes the vector size to 4
vector.resize(4);
cout <<"size: " << vector.size()<<endl;
// checks if the vector is empty or not
if (vector.empty()) {
cout<<"Vector is empty"<<endl;
} else {
cout<<"Vector is not empty"<<endl;
}
// Shrinks the vector
vector.shrink_to_fit();
cout << "capacity: "<< vector.capacity()<<endl;
cout << "Vector elements are: ";
for (auto i = vector.begin(); i != vector.end(); i++)
cout << *i <<" ";
}
运行输出
size: 5
capacity: 8
max_size: 4611686018427387903
size: 4
Vector is not empty
capacity: 4
Vector elements are: 1 2 3 4
- 元素访问
void accessElement() {
vector<int> vector;
for (int i = 1; i <= 10; i++)
vector.push_back(i * 10);
cout << "reference operator: "<<vector[2]<<endl;
cout << "at: "<< vector.at(4)<<endl;
cout << "fornt: "<< vector.front()<<endl;
cout << "back: "<< vector.back()<<endl;
}
运行输出
reference operator: 30
at: 50
fornt: 10
back: 100
- 插入和删除元素
void inserAndEarsetElement() {
// 定义vector拥有3个元素,值为10
vector<int> vec(3, 10);
vector<int> :: iterator it;
// 拿到迭代器
it = vec.begin();
// 在首元素之前插入
it = vec.insert(it, 20);
// 在当前it之前插入两个30
vec.insert(it, 2, 30);
cout <<"element is: ";
for (it = vec.begin(); it < vec.end(); it++) {
cout << *it << " ";
}
// 删除第二个元素
vec.erase(vec.begin() + 1);
cout <<"\nleft element is: ";
for (it = vec.begin(); it < vec.end(); it++) {
cout << *it << " ";
}
}
运行输出
element is: 30 30 20 10 10 10
- 交换和清理元素
void swapAndClearElements() {
vector <int> vec1;
vector <int> vec2;
vector <int> :: iterator i;
// 插入元素
vec1.push_back(10);
vec1.push_back(20);
vec2.push_back(30);
vec2.push_back(40);
// 交换之前打印输出
cout << "Before Swapping \n" << "Contents of vec1 : ";
for (i = vec1.begin(); i != vec1.end(); ++i)
cout << *i << '\t';
cout << "\nContents of vec2 : ";
for (i = vec2.begin(); i != vec2.end(); ++i)
cout << *i << '\t';
// 交换vector
swap(vec1, vec2);
// 交换之后打印输出
cout << "\n\nAfter Swapping "<<endl;
cout << "Contents of vec1 : ";
for (i = vec1.begin(); i != vec1.end(); ++i)
cout << *i << '\t';
cout << "\nContents of vec2 : ";
for (i = vec2.begin(); i != vec2.end(); ++i)
cout << *i << '\t';
// 清理并添加新元素
cout << "\n\nNow, we clear() and then add " << "an element 1000 to vec1 : ";
vec1.clear();
vec1.push_back(1000);
cout << vec1.front();
}
运行输出
Before Swapping
Contents of vec1 : 10 20
Contents of vec2 : 30 40
After Swapping
Contents of vec1 : 30 40
Contents of vec2 : 10 20
Now, we clear() and then add an element 1000 to vec1 : 1000