【STL】C++ vector基本使用

目录

一 vector常见构造

1 空容器构造函数(默认构造函数)

2 Fill 构造函数

3 Range 构造函数

4 拷贝构造函数

5 C++11构造

二 vector迭代器

1 begin && end

2 rbegin && rend

3 补充排序

三 vector 容量操作

1 size

2 resize

3 capacity

4 测试1

5 empty 

6 reserve

7 shrink_to_fit

8 注意

四 vector 修改操作

1 assign

2 push_back

3 pop_back

4 insert

5 erase

6 swap 

7 clear

五  vector 元素访问

1 operator [ ]

2 at

3 front && back

4 find

六 总结


一 vector常见构造

1 空容器构造函数(默认构造函数)

构造一个没有元素的空容器。

2 Fill 构造函数

构造一个包含 n 个元素的容器。每个元素都是 val 的副本。

3 Range 构造函数

构造一个容器,其中包含与范围 [first,last] 一样多的元素,每个元素都按相同的顺序从该范围中的相应元素构造而成。

4 拷贝构造函数

构造一个容器,其中包含 x 中每个元素的副本,顺序相同。

#include<iostream>
#include<vector>
using namespace std;

int main()
{
       vector<int> a;
       vector<int> b(4, 100);//也可以只写4 构造大小和容量为4并且初始化值为0的vector
       vector<int> c(b.begin(), b.end());
       vector<int> d(b);

       for (size_t i = 0; i < b.size(); i++)
       {
              cout << b[i] << ' ';
       }
       cout << endl;

       for (size_t i = 0; i < c.size(); i++)
       {
              cout << c[i] << ' ';
       }
       cout << endl;

       for (size_t i = 0; i < d.size(); i++)
       {
              cout << d[i] << ' ';
       }
       cout << endl;

       a = d;//赋值拷贝
       for (size_t i = 0; i < d.size(); i++)
       {
              cout << d[i] << ' ';
       }

       return 0;
}

迭代器构造能否和string产生联系?

void Test2()
{
       string s("123456");
       vector<int> v(s.begin(), s.end());
       for (auto e : v)
       {
              cout << e << " ";
       }
}

int main()
{
       //Test1();
       Test2();
       return 0;
}

这里的字符1 2 3 4 5 6 对应的ASCII的值 

5 C++11构造

vector<int> v1 = { 1,2,3,4,5 };
vector<int> v2{ 1,2,3,4,5 };
vector<int> v3({ 1,2,3 });

二 vector迭代器

这里只演示用法, 不做过多讲解

1 begin && end

iterator begin();const_iterator begin() const;
iterator end();const_iterator end() const;
void Test3()
{
       vector<int> v(4, 1);
       vector<int>::iterator it = v.begin();
       while (it != v.end())
       {
              cout << *it << ' ';
              ++it;
       }
       cout << endl;

       const vector<int> vv(4, 10);
       vector<int>::const_iterator itt = vv.begin();
       while (itt != vv.end())
       {
              cout << *itt << ' ';
              ++itt;
       }
       
}

2 rbegin && rend

reverse_iterator rbegin();const_reverse_iterator rbegin() const;
reverse_iterator rend();const_reverse_iterator rend() const;
void Test4()
{
       vector<int> v(5);
       vector<int>::reverse_iterator it = v.rbegin();
       int i = 1;
       while (it != v.rend())
       {
              *it += i;
              ++it;
              ++i;
       }
       for (auto e : v)
       {
              cout << e << ' ';
       }

}

这个大家就想成和begin && end 相反就行, 没啥难度

 

3 补充排序

#include<algorithm>

sort(v1.begin(), v1.end()); // 升序
sort(v1.begin(), v1.end(), greater<int>()); // 降序

三 vector 容量操作

 这里就讲常用的, 大家看明白意思就可以直接上手, 没啥难度的

1 size

返回容器中的元素数。

size_type size() const noexcept;

2 resize

调整容器的大小,使其包含 n 个元素。

void resize (size_type n);void resize (size_type n, const value_type& val);

调整容器的大小,使其包含 n 个元素。

如果 n 小于当前容器大小(size),则内容将减少到其前 n 个元素,删除超出的元素(并销毁它们)。

如果 n 大于当前容器大小,则通过在末尾插入任意数量的元素来扩展内容,以达到 n 的大小。如果指定了 val,则新元素将初始化为 val。

如果 n 也大于当前容器容量(capacity),则会自动重新分配分配的存储空间。size 和 capacity都要改变

请注意,此函数通过插入或擦除容器中的元素来更改容器的实际内容

3 capacity

分配的存储容量的返回大小

此容量不一定等于向量大小。它可以相等或更大,额外的空间可以容纳增长,而无需在每次插入时重新分配。

size_type capacity() const;

4 测试1

void Test5()
{
       vector<int> v(5, 10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.resize(2);
       cout << v.size() << endl;
       cout << v.capacity() << endl;
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.resize(4, 10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.resize(10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

}

5 empty 

返回向量是否为空(即其大小是否为 0)。

bool empty() const;

6 reserve

void reserve (size_type n);

请求容器容量至少足以包含 n 个元素。

如果 n 大于当前容器容量,则该函数会导致容器重新分配其存储,从而将其容量增加到 n(或更大)。

在所有其他情况下,函数调用不会导致重新分配,并且容器容量不受影响。

此函数对容器大小(size)没有影响,并且不能更改其元素。

void Test6()
{
       vector<int> v(5, 10);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(1);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(100);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(50);
       cout << v.size() << endl;
       cout << v.capacity() << endl;
}

7 shrink_to_fit

 请求容器减小其容量以适合其大小。

void shrink_to_fit();
void Test7()
{
       vector<int> v(4, 100);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.reserve(100);
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       v.shrink_to_fit();
       cout << v.size() << endl;
       cout << v.capacity() << endl;
}

8 注意

capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。

这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。

resize在开空间的同时还会进行初始化,影响size.

四 vector 修改操作

有些用法我没有演示出来, 因为实际应用的时候基本用不到, 大家如果感兴趣也可以查阅文档, 非常容易上手 

1 assign

为容器分配新内容,替换其当前内容,并相应地修改其大小

range(1)
template <class InputIterator>  void assign(InputIterator first, InputIterator last);

fill(2)
void assign(size_type n, const value_type& val);

initializer list(3)
void assign(initializer_list<value_type> il);
void Test8()
{
       vector<int> a(5, 10);
       cout << a.size() << endl;
       cout << a.capacity() << endl;

       a.assign(6, 1);
       for (auto e : a)
       {
              cout << e << ' ';
       }
       cout << endl;
       cout << a.size() << endl;
       cout << a.capacity() << endl;

       vector<int> b;
       b.assign(a.begin(), a.end() - 1);
       for (auto e : b)
       {
              cout << e << ' ';
       }
}

2 push_back

在容器末尾的当前最后一个元素之后添加一个新元素。val 的内容被复制(或移动)到新元素。

void push_back (const value_type& val);
void push_back (value_type&& val);
void Test9()
{
       vector<int> v(4);
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       for (auto e : v)
       {
              cout << e << ' ';
       }
}

3 pop_back

删除容器中的最后一个元素,从而有效地将容器大小减小 1。

void pop_back();

4 insert

过在指定位置的元素之前插入新元素来扩展容器,从而有效地通过插入的元素数增加容器大小

single element(1)
iterator insert(const_iterator position, const value_type& val);

fill(2)
iterator insert(const_iterator position, size_type n, const value_type& val);

range(3)
template <class InputIterator>iterator insert(const_iterator position, InputIterator 
first, InputIterator last);

move(4)
iterator insert(const_iterator position, value_type&& val);

initializer list(5)
iterator insert(const_iterator position, initializer_list<value_type> il);
void Test10()
{
       vector<int> v(4, 10);
       v.insert(v.begin(), 100);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.insert(v.end(), 4, 100);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;
}

5 erase

从容器中删除单个元素 (position) 或一系列元素 ( [first,last))

iterator erase (const_iterator position);
iterator erase (const_iterator first, const_iterator last);
void Test11()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       v.push_back(4);
       v.erase(v.begin());
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.erase(v.begin(), v.begin()+2);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;
}

6 swap 

通过 x 的内容交换容器的内容,x 是另一个相同类型的容器对象。size可能有所不同。

void swap (vector& x);
void Test12()
{
       vector<int> v1(4, 10);
       for (auto e : v1)
       {
              cout << e << ' ';
       }
       cout << endl;

       vector<int> v2(4, 1);
       v1.swap(v2);
       for (auto e : v1)
       {
              cout << e << ' ';
       }
       cout << endl;
}

7 clear

从容器中删除所有元素(这些元素被销毁),使容器的大小为0。

void clear() noexcept;
void Test13()
{
       vector<int> v(1, 4);
       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;

       v.clear();
       cout << v.size() << endl;
       cout << v.capacity() << endl;

       for (auto e : v)
       {
              cout << e << ' ';
       }
       cout << endl;
}

五  vector 元素访问

 

1 operator [ ]

reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
void Test14()
{
       vector<string> v;
       v.push_back("hello");
       v.push_back("world");

       cout << v[0] << endl;
       cout << v[1] << endl;

       cout << v[0][1] << endl;
       cout << v[0][2] << endl;
}

2 at

返回对容器中位置 n 处的元素的引用。

该函数会自动检查 n 是否在容器中有效元素的范围内,如果不是,则抛出out_of_range异常(即,如果 n 大于或等于其大小)。这与成员 operator[] 形成鲜明对比,后者不检查边界。

void Test15()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(2);
       
       cout << v[0] << endl;
       cout << v.at(0) << endl;     
}

3 front && back

void Test16()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);

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

4 find

template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)

在迭代器范围内寻找val, 如果 没找到, 那就返回v.end() 

void Test17()
{
       vector<int> v;
       v.push_back(1);
       v.push_back(3);
       v.push_back(2);
       v.push_back(0);

       vector<int>::iterator pos = find(v.begin(), v.end(), 2);
       if (pos != v.end())
       {
              v.insert(pos, 300);
       }
       for (auto e : v)
       {
              cout << e << ' ';
       }

}

 另一个测试:

int main()
{
       vector<int> v(1);
       v.push_back(1);
       v.push_back(2);
       v.push_back(3);
       v.push_back(4);
       vector<int>::iterator pos = find(v.begin(), v.end(), 9);
       v.insert(pos, 100);
       for (auto e : v)
       {
              cout << e << ' ';
       }

       return 0;

六 总结

好久没写博客了, 非常的抱歉. 很长一段时间都在学习Linux, 还是比较困难的. 中间也有一段时间摆烂. 幸好又复活过来了. 感谢所有支持我的人的陪伴吧!

vector这节用法非常简单的, 如果大家感觉概念和理解还是差点意思的话, 一定看看我前面写的 string, 里面对一些概念进行了详细讲解, 当然后续我也会出简单的模拟实现, 大家看了底层, 就更容易懂了. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/647760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Gin框架学习笔记(六)——gin中的日志使用

gin内置日志组件的使用 前言 在之前我们要使用Gin框架定义路由的时候我们一般会使用Default方法来实现&#xff0c;我们来看一下他的实现&#xff1a; func Default(opts ...OptionFunc) *Engine {debugPrintWARNINGDefault()engine : New()engine.Use(Logger(), Recovery())…

探秘SpringBoot默认线程池:了解其运行原理与工作方式(@Async和ThreadPoolTaskExecutor)

文章目录 文章导图Spring封装的几种线程池SpringBoot默认线程池TaskExecutionAutoConfiguration&#xff08;SpringBoot 2.1后&#xff09;主要作用优势使用场景如果没有它 2.1版本以后如何查看参数方式一&#xff1a;通过Async注解--采用ThreadPoolTaskExecutordetermineAsync…

LiveGBS流媒体平台GB/T28181用户手册-基础配置:信令服务配置、流媒体服务配置、白名单、黑名单、更多配置

LiveGBS流媒体平台GB/T28181用户手册-基础配置:信令服务配置、流媒体服务配置、白名单、黑名单、更多配置 1、基础配置1.1、信令服务配置1.2、白名单1.3、黑名单1.4、流媒体服务配置 2、搭建GB28181视频直播平台 1、基础配置 LiveGBS相关信令服务配置和流媒体服务配置都在这里…

React 中Redux结合React-Redux使用类组件版本(一)

一、Redux是什么&#xff1f; 1.Redux是一个专门用于状态管理的js库 2.它可以用在React、Angular、Vue的项目中&#xff0c;但基本与React配合使用。 3.作用&#xff1a;集中式管理React应用中多个组件共享的状态。 二、Redux 工作流程 三、Redux的三个核心概念 1.action 动…

在AndroidStudio创建虚拟手机DUB-AI20

1.DUB-AI20介绍 DUB-AL20是华为畅享9全网通机型。 华为畅享9采用基于Android 8.1定制的EMUI 8.2系统&#xff0c;最大的亮点是配置了1300万AI双摄、4000mAh大电池以及AI人脸识别功能&#xff0c;支持熄屏快拍、笑脸抓拍、声控拍照、手势拍照等特色的拍照功能&#xff0c;支持移…

搭建属于自己的 Git 仓库:GitLab

搭建属于自己的 Git 仓库&#xff1a;使用 GitLab 文章目录 搭建属于自己的 Git 仓库&#xff1a;使用 GitLab什么是 GitLab&#xff1f;准备工作安装 Docker使用Docker Compose 快速构建GitLab1、从docker compose快速搭建GitLab2、部署到服务器并访问3、浏览器访问 在现代软件…

Ant Design pro 6.0.0 搭建使用以及相关配置

一、背景 在选择一款比较合适的中台的情况下&#xff0c;挑选了有arco design、ant design pro、soybean、vue-pure-admin等中台系统&#xff0c;经过筛选就选择了ant design pro。之前使用过arco design 搭建通过组件库拼装过后台管理界面&#xff0c;官方文档也比较全&#…

数据库SQL语言实战(十)(最后一篇)

目录 前言 练习题 实验八 实验九 题目一 题目二 总结 前言 本篇练习题的重点有两个&#xff1a; 一、测试提交commit和回滚rollback的作用,了解锁等待、授权等知识。 二、学会复制表结构、学会插入数据&#xff0c;特别是学会如何避免重复插入&#xff0c;也就是如何避…

I2C SPI UART TCP/UDP AD/DA PWM大总结

I2C SPI UART TCP/UDP AD/DA PWM大总结 1. I2C总线描述1.1 基础协议内容1.1.1 通信时序1.1.2 一般通讯时序1.1.3 Burst模式 2. SPI总线2.1 基础协议内容 3. UART4. TCP/UDP5. AD/DA5.1 AD的原理5.2 DA的原理 6. PWM 1. I2C总线描述 I2C的特点&#xff1a;半双工&#xff0c;同步…

起保停电路工作原理

一、电路组成 起保停电路由电源保护设备&#xff08;空气开关&#xff09;、交流接触器、启动按钮、停止按钮和用电设备组成。 起保停电路的组成部分通常可分为四个部分&#xff1a; 保护部分&#xff1a;&#xff08;空气开关&#xff09;在电流或电压超出一定范围时自动切断…

计网期末复习指南:物理层(物理层的任务、香农公式、常用信道复用技术)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算机…

SpringBoot学习小结之RocketMQ

文章目录 前言一、架构设计1.1 架构图1.2 消息1.3 工作流程 二、部署2.1 单机2.2 集群 三、Springboot Producter3.1 准备3.2 pom依赖、yml 配置3.3 普通消息3.4 顺序、批量、延迟消息3.5 事务消息 四、Springboot Consumer4.1 配置4.2 普通Push消费4.3 回复4.4 集群和广播4.5 …

兆原数通基于Apache SeaTunnel的探索实践

随着大数据技术的不断发展&#xff0c;数据同步工具在企业中的应用变得愈发重要。为了满足复杂多样的业务需求&#xff0c;找到一款高效、灵活的数据同步工具变得尤为关键。 在这篇文章中&#xff0c;我们将分享兆原数通研发经理李洪军对Apache SeaTunnel的选择、应用及经验。这…

蓝桥杯物联网竞赛_STM32L071KBU6_关于size of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

【代码随想录】动态规划经典题

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 做题步骤 含义公式初始化顺序检查 确定dp数组以及下标的含义递推公式dp数组如何初始化遍历顺序打印dp数组&#xff08;看哪里有问题&#xff09; 斐波那契数 c…

高性能推理框架漫谈

传统模型分布式推理框架 Tensorflow servingPytorch ServingTriton Server 大语言模型的推理框架 其中&#xff0c; VLLM 后端接入了Ray 框架&#xff0c; 作为调度请求的分发处理&#xff1b;除此之外&#xff0c;还包括Nvidia 最新推出的TensorRT-LLM&#xff0c; 增加了对…

若依 ruoyi-vue 用户账号前后端参数校验密码 手机号 邮箱

前端 <el-dialog :title"title" :visible.sync"open" width"800px" append-to-body><el-form ref"form" :model"form" :rules"rules" label-width"120px"><el-row><el-col :span…

IOT技术怎么落地?以宝马,施耐德为例

物联网技术 物联网&#xff08;IoT&#xff09;技术正逐渐成为数字化工厂转型的核心驱动力。本文将通过实际案例&#xff0c;探讨IoT技术如何促进制造业的数字化转型&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;并提升产品质量。 1. 物联网技术简介 物联网技术通…

记录一次Netty的WSS异常

概述 业务场景 应用通过 WSS 客户端连接三方接口。在高并发压测时&#xff0c;出现了请求服务器写入失败的异常&#xff0c;该异常是偶发&#xff0c;出现的概率不到千分之一&#xff0c;异常如下图所示。 问题概述 注意&#xff1a; 因为握手是通过 http 协议进行的。所以…

SpringBoot整合WebSocket实现聊天室

1.简单的实现了聊天室功能&#xff0c;注意页面刷新后聊天记录不会保存&#xff0c;后端没有做消息的持久化 2.后端用户的识别只简单使用Session用户的身份 0.依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…