C++中的STL库中,容器vector的使用

vector 容器

vector 容器基本概念

        vector 的数据安排以及操作方式,与 array 非常相似,两者的唯一差别在于空间的 运用的灵活性。Array 是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬往新空间,再释放原来的空间。Vector 是动态空间,随着元素的加入,它 的内部机制会自动扩充空间以容纳新元素。因此 vector 的运用对于内存的合理利 用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个 大块头的 array 了。
        Vector 的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率, 一旦 vector 旧空间满了,如果客户每新增一个元素, vector 内部只是扩充一个元 素的空间,实为不智,因为所谓的扩充空间( 不论多大 ) ,一如刚所说,是 配置新 空间- 数据移动 - 释放旧空间 的大工程 , 时间成本很高,应该加入某种未雨绸缪的考 虑,稍后我们便可以看到 vector 的空间配置策略。

 vector 迭代器

        Vector 维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为 vector 的迭代器,因为 vector 迭代器所需要的操作行为,如 operaroe , operator->, operator++, operator--, operator+, operator-, operator+=, operator-=, 普通指针天生 具备。 Vector 支持随机存取,而普通指针正有着这样的能力。所以 vector 提供的 是随机访问迭代器 (Random Access Iterators).
根据上述描述,如果我们写如下的代码:
Vector::iterator it1;
Vector::iterator it2;
it1 的型别其实就是 Int ,it2 的型别其实就是 Teacher*.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
int main(){
        vector< int > v;
        for ( int i = 0 ; i < 10 ;i ++){
                v.push_back(i);
                cout << v.capacity() << endl; // v.capacity() 容器的容量
        }
        system( "pause" );
        return EXIT_SUCCESS;
}

vector 的数据结构

        Vector 所采用的数据结构非常简单,线性连续空间,它以两个迭代器 Myfirst 和 Mylast 分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器 _Myend 指向整块连续内存空间的尾端。
        为了降低空间配置时的速度成本,vector 实际配置的大小可能比客户端需求大一 些,以备将来可能的扩充,这边是容量的概念。换句话说,一个 vector 的容量永 远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个 vector 容器就得另觅居所。
注意:
        所谓动态增加大小,并不是在原空间之后续接新空间( 因为无法保证原空间之后尚
有可配置的空间 ) ,而是一块更大的内存空间,然后将原数据拷贝新空间,并释放 原空间。因此,对 vector 的任何操作,一旦引起空间的重新配置,指向原 vector 的所有迭代器就都失效了。这是程序员容易犯的一个错误,务必小心。

 vector 常用 API 操作

vector 构造函数

vector<T> v; // 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end()); // v[begin(), end()) 区间中的元素拷贝给本身。
vector(n, elem); // 构造函数将 n elem 拷贝给本身。
vector( const vector &vec); // 拷贝构造函数。
// 例子 使用第二个构造函数 我们可以 ...
int arr[] = { 2 , 3 , 4 , 1 , 9 };
vector< int > v1(arr, arr + sizeof (arr) / sizeof ( int ));

 vector 常用赋值操作

assign(beg, end); // [beg, end) 区间中的数据拷贝赋值给本身。
assign(n, elem); // n elem 拷贝赋值给本身。
vector& operator =( const vector &vec); // 重载等号操作符
swap(vec); // vec 与本身的元素互换。

 vector 大小操作

size(); // 返回容器中元素的个数
empty(); // 判断容器是否为空
resize( int num); // 重新指定容器的长度为 num ,若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
resize( int num, elem); // 重新指定容器的长度为 num ,若容器变长,则以 elem 值填
充新位置。如果容器变短,则末尾超出容器长 > 度的元素被删除。
capacity(); // 容器的容量
reserve( int len); // 容器预留 len 个元素长度,预留位置不初始化,元素不可访问。

 vector 数据存取操作

at( int idx); // 返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range 异常。
operator []; // 返回索引 idx 所指的数据,越界时,运行直接报错
front(); // 返回容器中第一个数据元素
back(); // 返回容器中最后一个数据元素

 vector 插入和删除操作

insert(const_iterator pos, int count,ele); // 迭代器指向位置 pos 插入 count 个元素 ele.
push_back(ele); // 尾部插入元素 ele
pop_back(); // 删除最后一个元素
erase(const_iterator start, const_iterator end); // 删除迭代器从 start en d 之间的元素
erase(const_iterator pos); // 删除迭代器指向的元素
clear(); // 删除容器中所有元素

 vector 小案例

 巧用 swap 收缩内存空间
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
int main(){
        vector< int > v;
        for ( int i = 0 ; i < 100000 ;i ++){
                v.push_back(i);
        }
        cout << "capacity:" << v.capacity() << endl;
        cout << "size:" << v.size() << endl;
        //此时 通过 resize 改变容器大小
        v.resize( 10 );
        cout << "capacity:" << v.capacity() << endl;
        cout << "size:" << v.size() << endl;
        //容量没有改变
        vector< int >(v).swap(v);
        cout << "capacity:" << v.capacity() << endl;
        cout << "size:" << v.size() << endl;
        system( "pause" );
        return EXIT_SUCCESS;
}

 reserve 预留空间

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
using namespace std;
int main(){
        vector< int > v;
        //预先开辟空间
        v.reserve( 100000 );
        int * pStart = NULL;
        int count = 0 ;
        for ( int i = 0 ; i < 100000 ;i ++){
                v.push_back(i);
                if (pStart != &v[ 0 ]){
                        pStart = &v[ 0 ];
                        count++;
                }
        }
        cout << "count:" << count << endl;
        system( "pause" );
        return EXIT_SUCCESS;
}

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

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

相关文章

前端开发的前世今生

现代前端开发简介 前端开发的历史CGIServer PageRIAAJAX前端组件化和工程化 现代前端开发模式前端工程化前端组件化单页应用微前端 更多相关技术游戏开发Web Assembly 小结 今天我们来稍微聊一下现代前端开发的过去和现状。 前端开发的历史 CGI 在互联网刚刚开始兴起的时代&a…

Python常用库大全及简要说明,附官方网站链接地址

文章目录 前言环境管理包管理包仓库分发构建工具交互式解析器文件日期和时间文本处理特殊文本格式处理自然语言处理文档配置命令行工具下载器图像处理OCR音频Video地理位置HTTP数据库数据库驱动ORMWeb 框架权限CMS电子商务RESTful API验证模板引擎队列搜索动态消息资源管理缓存…

HarmonyOS ArkTS与c++交互通信

一、创建Native C Module 1、右键项目->new->module 如图&#xff1a; 2、修改build-profile.json5配置 "externalNativeOptions": {"path": "./src/main/cpp/CMakeLists.txt","arguments": "-v -DOHOS_STLc_shared&quo…

Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊

文章目录 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊使用 RenderEffect 模糊使用 Vukan 模糊使用 GLSL 模糊RS、Vukan、RenderEffect、GLSL 效率对比 Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊 本文首发地址 https://blog.csdn.net/CSqingchen/articl…

运算放大器和常见运放电路

关于运算放大器 运算放大器(Operational Amplifier), 简称运放, 是一种直流耦合, 差模输入, 单端输出(Differential-in, single-ended output)的高增益电压放大器件. 运放能产生一个比输入端电势差大数十万倍的输出电势. 因为刚发明时主要用于加减法等运算电路中, 因而得名运算…

【Java】10. 循环语句

10. 循环语句 10.1 for循环 10.2 while循环 10.3 do…while循环 退出嵌套循环&#xff1a; 可以在最外侧循环加loop:&#xff08;变量任意&#xff09;&#xff0c;然后内侧循环执行return loop;即全部跳出循环System.exit(0);停止虚拟机运行

LLM算法工程师面试题总结

一、请简述对大模型的基本原理和架构的理解。 大型语言模型如GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列是基于自注意力机制的深度学习模型&#xff0c;主要用于处理和生成人类语言。下面简要概述了它们的一些基本原理和架构特点&#xff1a; 基本原…

springboot(ssm大学生心理健康诊断专家系统 心理健康平台Java(codeLW)

springboot(ssm大学生心理健康诊断专家系统 心理健康平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或…

线上问题整理-ConcurrentModificationException异常

项目场景&#xff1a; 商品改价&#xff1a;商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象 问题描述 商品改价中通过多线程批量处理经过 Lists.partition拆分的集合对象&#xff0c;发现偶尔会报 java.util.ConcurrentModificationException: nullat jav…

用element-ui进行简单的商品管理

安装element-ui 项目的控制台输入npm i element-ui -S main.js import ElementUI from element-ui;//引入element-ui模块 import element-ui/lib/theme-chalk/index.css;//引入element-ui的css样式 Vue.use(ElementUI);//使用ElementUI 商品管理组件 <template><…

力扣labuladong——一刷day60

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣663. 均匀树划分二、力扣687. 最长同值路径三、力扣814. 二叉树剪枝 前言 二叉树的递归分为「遍历」和「分解问题」两种思维模式&#xff0c;这道题需要…

使用Redis实现分布式锁

说明&#xff1a;在多线程情况下&#xff0c;我们需要用到锁来控制线程对资源的访问&#xff0c;当在多线程分布式的情况下&#xff0c;如果使用synchronized (this)&#xff0c;这会在每台服务器实例上都生成一个锁对象&#xff0c;而这个锁只会对当前实例生效&#xff0c;无法…

【数字图像处理】边缘检测

边缘检测是一种图像处理技术&#xff0c;用于在图像中识别和提取物体边缘的信息&#xff0c;广泛应用于计算机视觉和图像分析领域。本文主要介绍数字图像边缘检测的基本原理&#xff0c;并记录在紫光同创 PGL22G FPGA 平台的布署与实现过程。 目录 1 边缘检测原理 2 FPGA 布署…

【工具分享】| 阅读论文神器 使用技巧 AI润色 AI翻译

文章目录 1 使用技巧1.1 功能一 即时翻译1.2 功能二 文献跳转1.3 功能三 多设备阅读1.4 功能四 小组讨论笔记共享1.5 功能五 个人文献管理 2 其他功能 超级喜欢Readpaper这一款论文阅读软件&#xff0c;吹爆他哈哈 为什么&#xff1f; 当然是他可以解决我们传统阅读论文的种种…

ARM裸机-20(I2C通信)

1、什么是I2C通信 1.1、物理接口&#xff1a;SCL SDA (1)、SCL(serial clock)&#xff1a;时钟线&#xff0c;传输CLK信号&#xff0c;一般是I2C主设备向从设备提供时钟的通道。 (2)、SDA(serial data)&#xff1a;数据线&#xff0c;通信数据都通过SDA线传输。 1.2、通信特…

数据库范式1NF-4NF

码和属性 字段是对内而言的&#xff0c;private的 属性是对外而言的&#xff0c;public的 用Java中的类比喻就是一个对像里面定义了很多字段&#xff0c;一般情况下每个字段都有一组对应的getter&setter方法&#xff0c;注意到了吗&#xff0c;字段一般用private修饰&#…

HarmonyOs 4 (一) 认识HarmonyOs

目录 一 HarmonyOs 背景1.1 发展时间线1.2 背景分析1.2.1 新场景1.2.2 新挑战1.2.3 鸿蒙生态迎接挑战 二 HarmonyOS简介2.1 OpenHarmony2.2 HarmonyOS Connect2.3 HarmonyOS Next**2.4 ArkTS &#xff08;重点掌握&#xff09;****2.5 ArkUI** 三 鸿蒙生态应用核心技术理念**3.…

探索APP自动化测试工具的重要作用是什么?

随着移动应用市场的蓬勃发展&#xff0c;保障应用程序的质量和性能成为开发团队至关重要的任务。在这个背景下&#xff0c;APP自动化测试工具崭露头角&#xff0c;成为提高开发效率、减少错误率的关键工具。本文将探讨APP自动化测试工具的用途&#xff0c;以及它们在移动应用开…

mongoDB非关系型数据库学习记录

一、简介 1.1Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库,官方地址https://www.mongodb.com/ 1.2数据库是什么 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序 1.3数据库的作用 数据库的主要作用就是管理数据,对数据进行增©、删(d)、…

大语言模型(LLMs)在 Amazon SageMaker 上的动手实践(一)

本期文章&#xff0c;我们将通过三个动手实验从浅到深地解读和演示大语言模型&#xff08;LLMs&#xff09;&#xff0c;如何结合 Amazon SageMaker 的模型部署、模型编译优化、模型分布式训练等。 实验一&#xff1a;使用 Amazon SageMaker 构建基于开源 GPT-J 模型的对话机器…