1:vector基本概念
功能:vector 数据结构和数组非常相似,也称为 单端数组.
vector 与普通数组区别:
1: 数组是静态空间,而 vector 可以动态扩展
2: 动态扩展:并不是在原空间之后接新空间,而是找到更大的内存空间,然后将原数据拷贝到新空间。
vector 数据结构
vector 容器的迭代器支持随机访问,即可以跳越地访问容器元素,而不必逐个访问。
1.2 :vector 构造函数
功能描述:创建vector
函数原型
vector<T> V // 采用模板实现类实现,默认构造函数
vector(v.begin() , v.end()) // 将 v[begin(),end()] 区间中的元素拷贝给本身
vector(n,elem) // 构造函数将 n 个 elem元素拷贝给本身
vector(const vector & vec) // 拷贝构造函数
案例:测试几种构造函数
void printVector(vector<int> v) {
for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test() {
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
printVector(v);
vector<int> v2(v.begin(), v.end());
printVector(v2);
vector<int> v3(2, 100);
printVector(v3);
vector<int> v4(v3);
printVector(v4);
}
1.3 :vector赋值操作
功能描述:给vector 容器进行赋值
函数原型:
vector& operator=(const vector& v) // 重载等号操作符
assign(beg, end) // 将[beg,end] 区间中的数据拷贝赋值给本身
assign(n, elem) //将 n个 elem 元素拷贝赋值 给本身
案例:测试 vector 的几种赋值操作
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void printVector(vector<int> v) {
for (vector<int>::iterator it = v.begin(); it < v.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
void test() {
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
printVector(v);
// vector& operator=(const vector& v) 重载等号操作符
vector<int> v2 = v;
printVector(v2);
vector<int> v3;
v3.assign(v.begin(), v.end());
printVector(v3);
vector<int> v4;
v4.assign(2, 100);
printVector(v4);
}
int main() {
test();
}
1.4 :vector容量大小
功能描述:对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
1.5 :vector 插入和删除
功能描述: 对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<int> v1;
for (int i = 0; i < 10; i++)
{
v1.push_back(i);
}
printVector(v1);
// 弹出最后一个元素
v1.pop_back();
v1.pop_back();
printVector(v1);
// 在首个元素处 插入 100
v1.insert(v1.begin(), 100);
printVector(v1);
// 在首个元素处插入2个 200
v1.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;
}
1.6:vector数据存取
功能描述: 对vector 中的数据的存取操作
函数原型
at(int idx) //返回索引idx 所指的数据
operator[idx] // 返回索引 idx所指的数据
front() //返回容器中的第一个数据
back() // 返回容器中最后一个 数据元素
void test3() {
vector<int> 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;
}
1.7 :vector互换容器
功能描述:实现两个容器内元素进行互换 ,并实现内存收缩
函数原型: swap(vector) // 将vector元素 与本身的元素互换。
void test4() {
vector<int> v1;
vector<int> 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<int> 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); // 收缩大小为3
cout << "v 的容量为:" << v.capacity() << endl;
cout << "v的大小为:" << v.size() << endl;
// 下面的代码完成两件事
// 1:创建一个 和 v 的size相同的 vector 匿名对象
// 2: 将这个匿名对象和 v 互换(实际就是类型与将两个指针互换)
// 最后,v的 大小和容量就都是 3 , 而匿名对象大小 为3 ,容量为12138
// 待这行代码执行完毕,匿名随想被释放,所以就大道了收缩内存的 目的
vector<int>(v).swap(v);
cout << "v的容量为:" << v.capacity() << endl;
cout << "v的 大小为:" << v.size() << endl;
}
1.8 :vector预留空间
功能描述:减少vector 在动态扩展容量时的扩展次数
函数原型 :reserve(int len) //容器预留 len 个元素长度,预留位置不初始化,元素不可访问。
案例:通过预留空间 和不预留空间 ,测试在存放大量数据时 vector的扩容次数。