当前位置: 首页 > news >正文

C++ STL学习笔记: Vector

         读研一年,惊觉找工作的急迫性,决定提前布局,开始刷题。但是发现自己对C++的STL库都没有很好的掌握,决定通过做题来按照重要性的优先级进行学习,准备一系列笔记,首先需要掌握的就是vector的基本用法。

对Vector的基本认知

        向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

  • 注意其与array的区别。唯一区别在于array是空间运用方面array需要预先分配空间大小,并且无法改变,而vector是可以动态扩缩的。
  • vector可以存放任意类型的数据
  • vector是顺序容器

Vector的使用

创建

    std::vector<int> first;                               // 构造一个没有元素的空容器std::vector<int> second(2, 10);                       // 2个值为10的整数std::vector<int> third(second.begin(), second.end()); // 迭代器构造std::vector<int> fourth(third);                       // 拷贝构造std::vectir<int> list = {1,2,3,4,5};                  // 列表初始化

1.实参是函数调用时的实际参数值,形参是函数声明和定义时指定的参数名称。

2.实参和形参在函数实际调用时通过值传递方式发生联系,形参未调用时并不会分配空间和赋值,当调用时会分配空间,并且实参拷贝赋值给形参变量(值传递),实参值等于形参值。

3.函数内部只能访问形参值完成计算,无法直接访问实参。

4.函数调用结束后,形参占用的内存空间被释放,函数返回,实参仍然保留原来的内存空间和值。

访问

接口名称  用例
[ ]
vector<int> v(5, 1);//使用“下标+[]”的方式遍历容器for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}

at ( )
vector<int> v(5, 1);//使用“下标+[]”的方式遍历容器for (size_t i = 0; i < v.size(); i++){cout << v.at(i) << " ";}
vector<int>::iterator迭代器
vector<int>::iterator it = v.begin();
while (it != v.end())
{cout << *it << " ";it++;
}
//反向迭代器遍历容器
vector<int>::reverse_iterator rit = v.rbegin();
while (rit != v.rend())
{cout << *rit << " ";rit++;
}

for循环
vector<int> v(10, 10086);
for (auto i : v)
{cout << i << " ";
}

back

返回容器中最后的一个元素的引用,输出即为元素值

    cout << v.back() << endl;

front

返回容器中第一个元素的引用
    cout << v.front() << endl;

容量

容量空间接口说明
size返回容器中真实存在的元素个数
capacity返回分配的空间容量大小
resize(size调整容器的真实元素大小(size),直接访问会赋值默认0
reserve(size调整容器的容量大小(capacity),直接访问会报错
emptybool,判断容器是否为空

实际测试下来:

reserve部分编译器也不会报错,比如在线编译器在线编译器 – C/C++、Java、Python... | Techie Delight

比如这个:

#include <iostream>
#include <vector>
using namespace std;
using std::vector;
int main(void)
{vector<int> v;std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;v.reserve(10);cout<<v[9]<<endl;std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;v.resize(10);v.push_back(0);cout<<v[2]<<endl;std::cout<<"v.size() == " << v.size() << " v.capacity() = " << v.capacity() << std::endl;return 0;
}

输出是:

 v.size() == 0 v.capacity() = 0
0
v.size() == 0 v.capacity() = 10
0
v.size() == 11 v.capacity() = 20
 

修改

方法说明
push_back(elem)在末尾添加一个元素,有效元素个数加1

pop_back()

删除最后一个元素,有效元素个数减1
insert(pos,num_to_insert,value)在指定迭代器位置的元素之前插入新元素来扩展容器,注意v.end()指向的是最后一个元素的后一个元素
	int a[] = { 1,2,3,4,5 };vector<int> v(a, a + 5);// 在第一个位置插入一个 0v.insert(v.begin(), 0);for (auto ch : v){cout << ch << " ";}cout << endl;// 在最后一个位置插入2个 6v.insert(v.end(), 2, 6);for (auto ch : v){cout << ch << " ";}cout << endl;
//  0 1 2 3 4 5 
// 0 1 2 3 4 5 6 6 

erase从容器中删除单个元素,或一系列元素(迭代器区间[first,last])
	vector<int> v;for (int i = 0; i < 6; i++){v.push_back(i);}// // 删除指定位置的元素// v.erase(v.begin());// for (auto ch : v)// {// 	cout << ch << " ";// }// cout << endl;// 删除指定区间的元素v.erase(v.begin(), v.begin() + 2);for (auto ch : v){cout << ch << " ";}cout << endl;
//  1 2 3 4 5 
// 3 4 5 (这个是在 12345的基础上删掉的,左闭右开)

swap交换两个容器的内容,不常用,就是互换全部的内容,只要类型相同
find

查找(注意:这个是算法模块实现,不是vector的成员接口)

	int a[] = { 1,2,3,4,5,1,2,5,8,6 };vector<int> v(a, a + 10);vector<int>::iterator pos = find(v.begin(), v.end(), 5);//返回找到的第一个元素的迭代器if (pos != v.end()){v.erase(pos);}for (auto ch : v){cout << ch << " ";}//输出:1 2 3 4 1 2 5 8 6 

二维Vector

创建

size1行 size2列,全部初始化为0

vector<vector<int>> table(size1, vector<int>(size2, 0));
//获取行列数
vector<vector<int>> a(r, vector<int>(c));//没有初值默认为0
int row = a.size();          //获取行数
int column = a[0].size();    //获取列数vector<vector<int>> new_mat(r);//注意这个r是不可缺少的,规定其有多少行
for(int i=0 ;i<r; i++) //二维vector的初始化时有要求的
{new_mat[i].resize(c);
}

修改

insert(pos,elem),类似的a.erase(a.begin() + 2, a.begin() + 3);//删除a的第二列for (int i = 0; i < a.size(); i++){a[i].erase(a[i].begin() + 2, a[i].begin() + 3);}

http://www.dtcms.com/a/419693.html

相关文章:

  • CSS中 min() max() clamp()函数
  • 如何做免费企业网站小程序在建网站吗
  • sourcefare从入门到实战(2) - 创建第一个扫描项目(服务端Git方式)
  • 用html做网站源代码龙岩北京网站建设
  • Qt常用控件之QComboBox
  • 钢铁舞者:当机械臂成为机器人的“双手”,世界正被重塑
  • 从云端到终端,从大模型到机器人:智源众智FlagOS 1.5引领开放计算生态迈向成熟
  • 舆情网站直接打开的软件第三方商城网站建设
  • 网站seo收录工具北京建设银行纪念钞预定官方网站
  • 盐山县招聘网站建设上海建设工程安全监理网站
  • 1g做网站空间网络搭建安全分析
  • vue3边学边做系列(3)-路由缓存接口封装
  • 输入法网站设计网站seo在线诊断分析
  • 页面设计模板网站wordpress 免费好用主题
  • 提升准确率的处理
  • 透明水印logo在线制作东莞市seo网络推广报价
  • App 上架服务全流程解析,iOS 应用代上架、ipa 文件上传工具、TestFlight 测试与苹果审核实战经验
  • 织梦网站版权银行营销活动方案
  • 自己做视频网站会不会追究版权做网站界面一般用什么来做
  • less和sass
  • 单片机开发---RP2040数据手册之PIO功能
  • 怎么免费做网站视频教学网站不收录 域名问题
  • 青海省城乡建设厅网站首页网站缩放代码
  • 学习2025.9.28
  • C++协程
  • 模电基础:多级放大电路与集成运放的认识
  • 汕头网站推广教程.电子商务网站规划
  • 深入理解哈希表:闭散列与开散列两种实现方案解析
  • 无锡网站推广公司排名线下推广都有什么方式
  • Linux从入门到精通——基础指令篇(耐人寻味)