C++容器使用详解---vector容器

文章目录

      • 1.vector容器
        • 1.vector容器构造函数
        • 2.vector容器的赋值操作
        • 3.vector容器的容量和大小
        • 4.vector容器的插入和删除
        • 5.vector容器的数据存取
        • 6.vector容器互换容器
        • 7.vector容器预留空间

1.vector容器

std::vector是C++标准模板库(STL)中的一个动态数组容器,其内部实现基于动态内存分配,能够自动调整大小。

  1. 动态大小: vector容器能够在运行时动态地增加或减少其容量以适应元素的数量变化,无需程序员显式地管理内存。

  2. 连续内存: 虽然可以动态调整大小,但vector中的元素在内存中是连续存储的,这使得它支持快速随机访问,类似于传统的数组。

  3. 容量与尺寸:

    • 容量(capacity): 容量是指vector当前所分配的内存空间能容纳的元素最大数量,即使这些位置可能尚未被使用。
    • 大小(size): 大小是指vector当前实际存储的元素数量。
  4. 自动扩展: 当向vector添加元素导致当前容量不足以容纳新元素时,vector会自动重新分配内存,通常是原容量的一定倍数(例如,常见实现会加倍现有容量),以减少频繁的内存重分配。

  5. 高效操作:

    • 尾部插入和删除元素的操作非常高效。
    • 使用索引或at()方法可以快速访问元素,时间复杂度为O(1)。
    • 插入或删除非尾部元素可能需要移动后续元素,因此操作成本较高。
  6. 迭代器: vector提供了随机访问迭代器,允许类似指针的操作,可以进行高效的遍历和元素访问。

  7. 构造与初始化: vector可以通过默认构造函数、指定大小的构造函数、区间构造函数或使用初始化列表等方式进行构造和初始化。

  8. 内存管理: vector负责其内部元素的内存管理,包括分配和释放,减轻了程序员的负担,但这也意味着在插入和删除操作中可能会有性能开销,尤其是在需要重新分配内存时。

vector结合了数组的高效访问特性和动态数组的灵活性,是处理可变数量序列数据时的常用选择。

1.vector容器构造函数
/** vector<T> v;//采用模板实现类实现,默认构造函数* vector(v.begin(),v.end());//将v[begin(),end()]区间的元素拷贝给本身* vector(n,elem); //构造函数将n个elem拷贝给本身* vector(const vector &vec); //拷贝构造函数*/

示例:

#include <iostream>
#include "vector"
using namespace std;int main(){vector<int> v;v.reserve(10);for (int i = 0; i < 10; ++i) {v.push_back(i);}for (int & it : v){cout << it << " ";}cout << endl;vector<int>v1(v.begin(),v.end());for (int &it : v1){cout << it << " ";}cout << endl;vector<int>v3(10,100);for (int &it : v3){cout << it << " ";}cout << endl;vector<int>v4(v3);for (int &it : v4) {cout << it << " ";}return 0;
}
2.vector容器的赋值操作
/** vector& operator=(const vector &vec);//重载等号操作符* assign(beg,end);//将[beg,end)区间中的数据拷贝赋值给本身,* assign(n, elem);//将n个elem拷贝赋值给本身。*/

示例:

#include <iostream>
#include <vector>
using namespace std;int main(){vector<int>v;v.push_back(10);v.push_back(20);vector<int>v1;v1 = v;for (int &it : v1){cout << it << " ";}cout << endl;vector<int>v2;v2.assign(v.begin(), v.end());for(int &it : v2){cout << it << " ";}cout << endl;v2.assign(10,100);for(int &it : v2){cout << it << " ";}return 0;
}
3.vector容器的容量和大小
empty();//判断容器是否为空
capacity();//容器的容量
size();//返回容器中元素的个数
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。//如果容器变短,则末尾超出容器长度的元素被删除。resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置//如果容器变短,则未尾超出容器长度的元素被删除

示例:

#include <iostream>
#include "vector"
using namespace std;int main(){vector<int>v;if (v.empty()){cout << "Nothing" << endl;}v.push_back(10);cout << v.size() << endl;v.reserve(5);  // 只扩充容量 不填充值  预先为vec分配至少能容纳5个元素的内存空间v.resize(5);for(int &it : v){cout << it << endl;}cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(10);v.resize(10,10); //扩充部分填充10cout << v.size() << endl;cout << v.capacity() << endl;return 0;
}
4.vector容器的插入和删除
push back(ele);//尾部插入元素ele
pop_back();//删除最后一个元素
insert(const iterator pos,ele);//迭代器指向位置pos插入元素ele
erase(const iterator pos);//删除迭代器指向的元素
insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
erase(const iterator start,const iterator end);//删除迭代器从start到end之间的元素
clear();//删除容器中所有元素

示例:

#include <iostream>
using namespace std;
#include "vector"
int main(){vector<int>v;v.push_back(10);v.push_back(20);for(int &it : v){cout << it << " ";}cout << endl;v.pop_back();v.insert(v.begin(),5);for(int &it : v){cout << it << " ";}cout << endl;v.insert(v.begin(),101);for(int &it : v){cout << it << " ";}cout << endl;v.erase(v.begin());for(int &it : v){cout << it << " ";}cout << endl;v.erase(v.begin(), v.end());for(int &it : v){cout << it << " ";}cout << endl;v.clear();for(int &it : v){cout << it << " ";}return 0;
}
5.vector容器的数据存取
at(int idx);//返回索引idx所指的数据
operator[];//返回索引idx所指的数据
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素

示例:

#include <iostream>
#include "vector"
using namespace std;int main(){vector<int>v;v.reserve(10);for(int i = 0;i < 10;++i){v.push_back(i);}cout << v.at(0) << endl;cout << v[1] << endl;cout << v.front() << endl;cout << v.back() << endl;return 0;
}
6.vector容器互换容器
swap(vec);//将容器vec与自身互换

示例:

#include <iostream>
#include "vector"
using namespace std;int main() {vector<int> v;v.reserve(10);for (int i = 0; i < 10; ++i) {v.push_back(i);}vector<int>v1;v1.swap(v);for(int &it : v1){cout << it << " ";}//使用swap收缩内存//vector<int>(v).swap(v); //创建匿名对象以v的大小初始化,互换两个容器,匿名对象在当前行执行完毕后,内存被回收return 0;
}
7.vector容器预留空间

在C++的STL中,std::vector容器的reserve方法用于预先为容器分配内存空间,但不初始化元素,也不改变容器中元素的数量。这个方法的主要目的是为了优化性能,特别是当你已经知道或者可以预测到容器未来需要容纳多少元素时,通过提前分配足够的内存,可以减少在插入元素过程中因自动扩容而引起的内存重新分配和数据迁移次数。

  • 功能reserve函数允许你设定容器的容量(capacity)。也就是说,它保证了在不做进一步内存重新分配的情况下,容器至少可以容纳指定数量的元素。

  • 参数:它接受一个参数,即你希望预留的未初始化元素的个数。这个参数应该是非负的,如果小于当前容量,则调用不会有任何效果。

  • 不影响元素:调用reserve不会改变容器中已有元素的数量,也不会影响已有元素的值。

  • 性能优势:通过预先分配内存,可以避免在多次插入操作中频繁地重新分配和复制数据,这对于性能敏感的应用特别重要。特别是在循环中添加大量元素时,先调用一次reserve可以显著提升效率。

  • 不初始化元素:与resize不同,reserve不会修改容器的实际大小(即元素数量),也不会对新分配的内存区域中的元素进行初始化。

  • 示例用法:

    std::vector<int> vec;
    vec.reserve(100); // 预先为vec分配至少能容纳100个元素的内存空间
    

reserve是一种优化手段,帮助程序减少运行时的内存管理和分配开销,特别是在明确知道所需内存大小的情况下。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT QThread 线程类的使用及示例

QThread 是 Qt 框架提供的一个用于处理多线程的类&#xff0c;它允许开发者编写具有并发功能的应用程序&#xff0c;提高程序的响应速度、执行效率和用户体验。 在操作系统中&#xff0c;线程是进程内的执行单元&#xff0c;拥有独立的执行路径。每个线程有自己独立的栈空间&a…

从零开始学Spring Boot系列-集成Spring Security实现用户认证与授权

在Web应用程序中&#xff0c;安全性是一个至关重要的方面。Spring Security是Spring框架的一个子项目&#xff0c;用于提供安全访问控制的功能。通过集成Spring Security&#xff0c;我们可以轻松实现用户认证、授权、加密、会话管理等安全功能。本篇文章将指导大家从零开始&am…

Oracle day15

/*create table f0307 ( id number ,productname varchar2(100) ,parentid number); insert into f0307 values ( 1,汽车,null); insert into f0307 values ( 2,车身,1); insert into f0307 values ( 3,发动机,1); insert into f0307 values ( 4,车门,2); insert into f0307 va…

日期类(java)

文章目录 第一代日期类 Date常用构造方法SimpleDateFormat 日期格式化类日期转字符串&#xff08;String -> Date)字符串转日期 (String->Date) 第二代日期类 Calendar常用字段与如何得到实例对象相关 API 第三代日期类&#xff08;LocalDate\TIme)日期&#xff0c;时间&…

springboot + Vue前后端项目(第二十一记)

项目实战第二十一记 写在前面1. springboot文件默认传输限制2. 安装视频插件包命令3. 前台Video.vue4. 创建视频播放组件videoDetail.vue5. 路由6. 效果图总结写在最后 写在前面 本篇主要讲解系统集成视频播放插件 1. springboot文件默认传输限制 在application.yml文件中添…

pip安装neuralcoref失败ERROR

最终解决的方法如下&#xff1a; git clone https://github.com/huggingface/neuralcoref.git cd neuralcoref pip install -r requirements.txt python setup.py install 原始步骤&#xff1a; 安装 neuralcoref 的依赖&#xff1a; 安装编译 neuralcoref 所需的依赖项&am…

PHP If...Else 语句的深入解析

PHP If...Else 语句的深入解析 在PHP编程语言中&#xff0c;if...else 语句是一种基本且强大的控制结构&#xff0c;它允许根据特定条件执行不同的代码块。这种结构对于决策制定和流程控制至关重要&#xff0c;是每位PHP开发者必须熟练掌握的内容。本文将详细探讨if...else语句…

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…

MCU解决800V电动汽车牵引逆变器的常见设计挑战的3种方式

电动汽车 (EV) 牵引逆变器是电动汽车的。它将高压电池的直流电转换为多相&#xff08;通常为三相&#xff09;交流电以驱动牵引电机&#xff0c;并控制制动产生的能量再生。电动汽车电子产品正在从 400V 转向 800V 架构&#xff0c;这有望实现&#xff1a; 快速充电 – 在相同…

WPF 2024 金九银十 最新 高级 架构 面试题 C#

含入门 初级 中级 高级 不同级别WPF的面试题 相关面试题 redis安装说明书 http://t.csdnimg.cn/iM260 单体并发瓶颈 redis sqlsever mysql多少 http://t.csdnimg.cn/DTXIh Redis高频面试题http://t.csdnimg.cn/FDOnv 数据库SqlServer笔试题 数据库SqlServer笔试题-CSDN博客 SQL…

绝了!Stable Diffusion做AI治愈图片视频,用来做副业简直无敌!10分钟做一个爆款视频保姆教程

一 项目分析 这个治愈类视频的玩法是通过AI生成日常生活场景&#xff0c;制作的vlog&#xff0c;有这样的一个号&#xff0c;发布了几条作品&#xff0c;就涨粉了2000多&#xff0c;点赞7000多&#xff0c;非常的受欢迎。 下面给大家看下这种作品是什么样的&#xff0c;如图所…

探索高效开发神器:Blackbox AI(免费编程助手)

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 &#x1f916; 想要代码生成&#xff1f;&#x1f44c; &#x1f4ac; 需要和AI聊天解决难题&#xff1f;&#…

Ubuntu使用c++

Ubuntu使用c 一、安装编译器和开发工具二、创建一个c文件并运行1.创建一个c2.编译运行 一、安装编译器和开发工具 先安装vim sudo apt install vim再安装GUN编译器合集&#xff08;GCC&#xff09; sudo apt install build-essential使用g -v查看版本确定安装成功 二、创建…

Javaweb-初学

1.利用springboot开发一个web应用 简要流程&#xff0c;如下图 2.如何创建一个springboot的项目&#xff0c;下面两张图片是重点关注 第一张图片记得和图片一样改一下路径 第二张就是勾一个选项 3.第一个简单的springboot应用的开发 根据如下步骤进行操作 首先顶部要标识Res…

TensorFlow的学习1.2-基本概念

TensorFlow的学习2-基本概念 1. 张量&#xff08;Tensor&#xff09;2. 变量&#xff08;Variable&#xff09;3. 操作&#xff08;Operation&#xff09;4. 计算图&#xff08;Computational Graph&#xff09;5. 会话&#xff08;Session&#xff09;6. Eager Execution7. 数…

LinkedIn被封原因和解封方法

对于初识领英和对领英生态规则不熟悉的人来说&#xff0c;很容易造成领英账号被封号(被限制登录)的情况&#xff0c;那么如何才能避免和解决领英帐号被封号(被限制登录)的难题呢&#xff1f; 领英帐号被封号或被限制登录主要会有两类情况。 首先要搞清楚&#xff0c; Linkedi…

IP白名单及其作用解析

在网络安全领域&#xff0c;IP白名单是一项至关重要的策略&#xff0c;它允许特定的IP地址或地址范围访问网络资源&#xff0c;从而确保只有受信任的终端能够连接。下面&#xff0c;我们将深入探讨IP白名单的定义、作用以及实施时的关键考虑因素。 一、IP白名单的定义 IP白名单…

HTML与Python生成验证码的对比分析

前言 验证码&#xff08;CAPTCHA&#xff09;是确保用户行为为人类而非机器人自动执行的一种安全机制。通过图形、文字、或其他手段生成复杂的验证码来防止自动化攻击是一种常见的方法。本文将对比分析使用HTML与JavaScript和Python生成验证码的两种方式&#xff0c;探讨各自的…

【scau大数据原理】期末复习——堂测题

一、集群安装知识 启动集群的命令start-all.sh位于 Hadoop安装目录的sbin文件夹 目录下。 bin文件夹下包含常见的Hadoop,yarn命令&#xff1b;sbin命令下包含集群的启动、停止命令。 启动集群的命令start-all.sh包含 同时启动start-dfs.sh和start-yarn.sh 功能。…

AI与Python共舞:如何利用深度学习优化推荐系统?

AI与Python共舞&#xff1a;如何利用深度学习优化推荐系统&#xff1f; 当你在浏览新闻、电影或是购物平台时&#xff0c;那些仿佛读懂你心思的个性化推荐背后&#xff0c;正是AI技术与Python语言的精妙协作。今天&#xff0c;我们将通过一个实际案例&#xff0c;探索如何利用…