功能:vector 数据结构和数组非常相似,也称为 单端数组.
vector 与普通数组区别:
1: 数组是静态空间,而 vector 可以动态扩展
2: 动态扩展:并不是在原空间之后接新空间,而是找到更大的内存空间,然后将原数据拷贝到新空间。
![]()
vector 数据结构
vector 容器的迭代器支持随机访问,即可以跳越地访问容器元素,而不必逐个访问。
功能描述:创建vector
函数原型
vector
V // 采用模板实现类实现,默认构造函数 vector(v.begin() , v.end()) // 将 v[begin(),end()] 区间中的元素拷贝给本身
vector(n,elem) // 构造函数将 n 个 elem元素拷贝给本身
vector(const vector & vec) // 拷贝构造函数
案例:测试几种构造函数
void printVector(vector v) {for (vector::iterator it = v.begin(); it < v.end(); it++){cout << *it << " ";}cout << endl;
}void test() {vector v;for (int i = 0; i < 10; i++){v.push_back(i);}printVector(v);vector v2(v.begin(), v.end());printVector(v2);vector v3(2, 100);printVector(v3);vector v4(v3);printVector(v4);
}
功能描述:给vector 容器进行赋值
函数原型:
vector& operator=(const vector& v) // 重载等号操作符
assign(beg, end) // 将[beg,end] 区间中的数据拷贝赋值给本身
assign(n, elem) //将 n个 elem 元素拷贝赋值 给本身
案例:测试 vector 的几种赋值操作
#include
#include
#include
using namespace std;void printVector(vector v) {for (vector::iterator it = v.begin(); it < v.end(); it++){cout << *it << " ";}cout << endl;
}void test() {vector v;for (int i = 0; i < 10; i++){v.push_back(i);}printVector(v);// vector& operator=(const vector& v) 重载等号操作符vector v2 = v;printVector(v2);vector v3;v3.assign(v.begin(), v.end());printVector(v3);vector v4;v4.assign(2, 100);printVector(v4);}int main() {test();
}
功能描述:对vector 容器的容量和大小进行操作
函数 原型:
empty() // 判断容器是否为空
capacity() // 容器的容量
size() // 放回容器中元素的 个数
resize(int num) // 重新指定容器 的长度 num , 若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超出容器 长度的元素被删除。
resize(int num,elem) // 重写指定容器的长度 num , 若容器 变长,则以elem 值填充新位置,如果容器变短,则末尾超出容器 长度的元素被删除
案例:测试 vector容量相关的操作
通过运行结果可知:
1:resize改变的是 vector 的大小,而不是容量
2:如果resize 后vector 的大小增加,并超过原来的容量,则会自动增加容量。
3:如果resize后 vector的大小减少,则容量不变
4:容量不等于 size
功能描述: 对vector 容器进行插入,删除操作
函数原型:
push_back(ele) // 尾部插入 元素ele
pop_back() // 删除最后一个元素
insert(const _iterator pos,ele) // 迭代器指向位置pos并插入元素 ele
erase(const_iterator pos) // 删除迭代器指向的元素
erase(const_iterator start, const_iterator end) // 删除迭代器从start 到end 之间 的元素
clear() // 删除 容器中所有元素
案例 :测试 vector的删除和插入操作
void test2() {vector v1;for (int i = 0; i < 10; i++){v1.push_back(i);}printVector(v1);// 弹出最后一个元素v1.pop_back();v1.pop_back();printVector(v1);// 在首个元素处 插入 100v1.insert(v1.begin(), 100);printVector(v1);// 在首个元素处插入2个 200v1.insert(v1.begin(), 2, 100);// 删除最后两个元素v1.erase(v1.end() - 2, v1.end());// 清空vector,并不会改变 vector的容量v1.clear();printVector(v1);cout << "v1的大小为:" << v1.size() << endl;cout << "v1的容量为:" << v1.capacity() << endl;
}
功能描述: 对vector 中的数据的存取操作
函数原型
at(int idx) //返回索引idx 所指的数据
operator[idx] // 返回索引 idx所指的数据
front() //返回容器中的第一个数据
back() // 返回容器中最后一个 数据元素
void test3() {vector v1;for (size_t i = 0; i < num; i++){v1.push_back(i);}for (int i = 0; i < num; i++){cout << v1[i] << " ";}cout << endl;for (int i = 0; i < num; i++){cout << v1.at(i) << " ";}cout << endl;cout << "首元素:" << v1.front() << endl;cout << "尾元素:" << v1.back() << endl;
}
功能描述:实现两个容器内元素进行互换 ,并实现内存收缩
函数原型: swap(vector) // 将vector元素 与本身的元素互换。
void test4() {vector v1;vector v2;for (int i = 0; i < num; i++){v1.push_back(i);}printVector(v1);for (int i = num; i >0; i--){v2.push_back(i);}printVector(v2);v1.swap(v2);printVector(v1);printVector(v2);
}
通过swap 实现内存收缩
// swap实现内存收缩
void test5() {vector v;for (int i = 0; i < 10000; i++){v.push_back(i);}cout << "v 的容量为:" << v.capacity() << endl;cout << "v 的大小为:" << v.size() << endl;v.resize(3); // 收缩大小为3cout << "v 的容量为:" << v.capacity() << endl;cout << "v的大小为:" << v.size() << endl;// 下面的代码完成两件事// 1:创建一个 和 v 的size相同的 vector 匿名对象// 2: 将这个匿名对象和 v 互换(实际就是类型与将两个指针互换)// 最后,v的 大小和容量就都是 3 , 而匿名对象大小 为3 ,容量为12138// 待这行代码执行完毕,匿名随想被释放,所以就大道了收缩内存的 目的vector(v).swap(v);cout << "v的容量为:" << v.capacity() << endl;cout << "v的 大小为:" << v.size() << endl;
}
功能描述:减少vector 在动态扩展容量时的扩展次数
函数原型 :reserve(int len) //容器预留 len 个元素长度,预留位置不初始化,元素不可访问。
案例:通过预留空间 和不预留空间 ,测试在存放大量数据时 vector的扩容次数。