1.Vector(向量容器)
一.概述
Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。
二.特点
1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() pop_back();
2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at();
3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的;
4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现是按照顺序表的原理;
5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop;
6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小;
Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。
三.常用API
Constructors | 构造函数 |
Operators | 对vector进行赋值或比较 |
assign() | 对Vector中的元素赋值 |
at() | 返回指定位置的元素 |
back() | 返回最末一个元素 |
begin() | 返回第一个元素的迭代器 |
capacity() | 返回vector所能容纳的元素数量(在不重新分配内存的情况下) |
clear() | 清空所有元素 |
empty() | 判断Vector是否为空(返回true时为空) |
end() | 返回最末元素的迭代器(译注:实指向最末元素的下一个位置) |
erase() | 删除指定元素 |
front() | 返回第一个元素 |
get_allocator() | 返回vector的内存分配器 |
insert() | 插入元素到Vector中 |
max_size() | 返回Vector所能容纳元素的最大数量(上限) |
pop_back() | 移除最后一个元素 |
push_back() | 在Vector最后添加一个元素 |
rbegin() | 返回Vector尾部的逆迭代器 |
rend() | 返回Vector起始的逆迭代器 |
reserve() | 设置Vector最小的元素容纳数量 |
resize() | 改变Vector元素数量的大小 |
size() | 返回Vector元素数量的大小 |
swap() | 交换两个Vector |
四.示例Demo
#include <iostream> #include <vector> #include <stdlib.h> using namespace std; #pragma warning(disable:4996) struct Teacher { char name[20]; int age; }; void printfV(vector<int> &c) { int size = c.size(); for (int i = 0; i < size; i++) { cout << c[i] << endl; } } void printfPTeacher(vector<Teacher *> &c) { int size = c.size(); for (int i = 0; i < size; i++) { cout << "name is:" << c[i]->name << ", age is:" << c[i]->age << endl; } } void printfVTeacher(vector<Teacher> &c) { int size = c.size(); for (int i = 0; i < size;i++) { cout << "name is: " << c[i].name << ", age is: " << c[i].age << endl; } } int main() { vector<int> v1(5); for (int i = 0; i < 5; i++) { v1[i] = i + 1; } for (int i = 0; i < 5; i++) { cout << v1[i] << endl; } printf("---------------------------------------\n"); vector<int> v2(20); v2 = v1; printfV(v2); printf("---------------------------------------\n"); // vector 会把20个元素全部初始化为0 vector<int> v3(20); v3.push_back(100); v3.push_back(101); printfV(v3); printf("---------------------------------------\n"); vector<Teacher> v4(3); Teacher t1, t2, t3; t1.age = 11; t2.age = 22; t3.age = 33; strcpy(t1.name,"Tom"); strcpy(t2.name,"Jack"); strcpy(t3.name,"Mike"); v4[0] = t1; v4[1] = t2; v4[2] = t3; printfVTeacher(v4); printf("---------------------------------------\n"); vector<Teacher *> v5(3); Teacher *p1 = (Teacher *)malloc(sizeof(Teacher)); p1->age = 111; strcpy(p1->name,"Person1"); Teacher *p2 = (Teacher *)malloc(sizeof(Teacher)); p2->age = 222; strcpy(p2->name, "Person2"); Teacher *p3 = (Teacher *)malloc(sizeof(Teacher)); p3->age = 222; strcpy(p3->name, "Person3"); v5[0] = p1; v5[1] = p2; v5[2] = p3; printfPTeacher(v5); system("pause"); return 0; }
运行结果:
1
2
3
4
5
---------------------------------------
1
2
3
4
5
---------------------------------------
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
100
101
---------------------------------------
name is: Tom, age is: 11
name is: Jack, age is: 22
name is: Mike, age is: 33
---------------------------------------
name is:Person1, age is:111
name is:Person2, age is:222
name is:Person3, age is:222
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库