C++:STL:常用容器(上):vector
创始人
2024-04-30 10:59:51
0

1:vector基本概念

功能:vector 数据结构和数组非常相似,也称为 单端数组.

vector 与普通数组区别:

1: 数组是静态空间,而 vector 可以动态扩展 

2: 动态扩展:并不是在原空间之后接新空间,而是找到更大的内存空间,然后将原数据拷贝到新空间。

 

vector 数据结构

vector 容器的迭代器支持随机访问,即可以跳越地访问容器元素,而不必逐个访问。 

1.2 :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);
}

1.3 :vector赋值操作 

功能描述:给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();
}

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 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;
}

 1.6:vector数据存取

功能描述: 对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;
}

1.7  :vector互换容器 

功能描述:实现两个容器内元素进行互换 ,并实现内存收缩

函数原型: 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;
}

 

1.8 :vector预留空间 

功能描述:减少vector 在动态扩展容量时的扩展次数 

函数原型 :reserve(int len) //容器预留 len 个元素长度,预留位置不初始化,元素不可访问。

案例:通过预留空间  和不预留空间 ,测试在存放大量数据时 vector的扩容次数。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...