C/C++相关概念和易错知识点(34)(初始化注意事项、vector、编译器向上查找规则)

C++ vector初始化方法详解:从基础语法到性能优化实战 在C++标准模板库(STL)中,容器是管理数据集合的核心组件,其初始化方式直接影响程序的正确性与执行效率。vector作为最常用的动态数组容器,其底层基于连续内存分配与自动扩容机制,理解其初始化原理对编写高性能代码至关重要。从工程实践角度看,不同的初始化方法在内存分配策略、元素构造次数上存在显著差异,不当使用会导致不必要的拷贝开销与内存重分配,成为性能瓶颈。本文聚焦于vector初始化的多种技术方案,涵盖默认构造、列表初始化、迭代器范围构造及C++11/17新特性,并结合emplace_back原位构造、r 阅读详情

1.当我们在代码中想要终止运行的话,我们可以采用Ctrl + C或Ctrl + Z,其中^C代表杀进程,^Z设置结束

2.编码表:我们目前比较熟悉的是ASCII码编码方式,但是我们发现平时使用的汉字无法通过ASCII编码,除此之外,世界上各个国家的文字都需要编码,因此Unicode统一码(万国码)被研发出来了,它针对世界上各个国家的语言采用不同的编码方式,其中最常见的就是UTF-8,它针对不同的语言符号有不同长度的编码,从1个字节到4个字节不等。UTF-16编码长度固定为2个字节或4个字节,而UTF-32是以固定长度4个字节的编码来表示语言符号的,它们在存储上要消耗更大的空间,同时也能表示出更多符号,但UTF-8基本上能表示常见的字符了,因此一般使用UTF-8。

在string头文件里我们也可以看到专门针对不同存储方式的string,但是平时几乎不使用,了解即可。

在我们国家,为了进一步表示一些字体,我们自己研发了GBK编码方式,它在某种程度上比UTF-8表示中文更丰富。目前在Windows下大多采用的就是GBK编码。

3.整型家族在static修饰的下可在声明处定义

但注意仅限于整型家族,如flaot、double等都不支持这种写法,都只能声明和定义分离

4.初始化注意事项

由于new初始化方式比较易混,这里总结了一些常见的易混点,正常情况下别乱用

多参数易混点:

单参数易混点:

这里注意,只要开辟空间的形式是数组,那么不管开几个空间,都会遵循数组的初始化规则

在其余初始化场景,也遵循上面的初始化规则

其中有几种写法很易混,最好不要这样去写

b和d的初始化内部的{}是隐式类型转换,如果参数过多会被识别为initializer_list

同时注意逗号表达式的()可以嵌套,只要满足上面的初始化规则,就可以这样写

5.vector基本理解

在接触了string之后,我们对每个容器的框架都有了一个基本的认识,因此其余容器的学习就会轻松一些。 

(1)vector相当于我们之前接触过的顺序表,是对连续的数据进行存储,这个数据可以是任意类型,但是不支持int、double等存到同一个vector里,因为vector的实现涉及模板template,需要显式实例化,如果出现多种类型会发生推理冲突。空间配置器是vector模板声明第二个参数,涉及内存池,有缺省值,我们不用太在意。

(2)string和vector<char>差距很大,string可以一次性加入一个串,而vector<char>只能单独加字符,string不管怎么操作,数据最后一定有个\0,而vector尾插不会有这个功能,需要自己去处理\0的情况,很不方便。同时,vector<char>也缺少一些必要的接口,如c_str。

但vector和string很多接口相似,访问都可以用下标+[],迭代器,范围for(本质也是迭代器)

因此我们可知,string是专门针对字符数组的需求设计的,而vector是广泛适应的,vector不能替代string,需要根据不同的场景有不同的选择。

(3)初始化

(4)迭代器和string的没有任何使用区别

(5)访问和string的没有任何使用区别

front和back的返回值和operator[]一样,但注意back返回的不是最后一个元素的下一个位置,而是最后一个元素的位置,这里要和end迭代器做区分

(6)容量相关接口和string的没有任何使用区别

唯一需要注意的是resize和reserve

resize不仅会扩容,还会填充开辟空间的值,注意缺省值

reserve只开辟空间(可能开辟的最终空间比n多),不做任何处理。

注意最好不要缩容,不同编译器会有不同处理方式,比如msvc下,reserve很多情况下不会缩容,resize会缩容,但在g++下,都会缩容。

(7)在有的接口上,vector就和string有不同之处了,主要体现在参数的传递上


我们发现,vector下的接口要简洁很多,多个数据的插入和删除都是通过迭代器来控制的。

6.编译器向上查找规则

当我们调用函数的时候,编译器会从函数调用处向上查找该函数,如果没有相关声明或定义会报错。那么下面这种情况是什么导致的呢?

很多人会认为是因为test.h中没有展开std导致cout和endl不能使用,但是下面这种情况呢?

我们依然需要用向上查找来解释。

.h文件在预处理阶段就会展开,因此.h不存在编译链接的情况,所以根据“.h中没有展开std导致cout和endl不能使用”完全是错误的。在.h展开后,在调用test()时,需要向上查找cout,但是cout是在std命名空间里的,所以需要展开命名空间才能正常访问。

图1展开命名空间的语句在展开头文件的下面,因此在向上查找的情况下,并不会读取using namespace std,也就不会在std命名空间里找,所以找不到。

而图2展开命名空间的语句在展开头文件的上面,因此查找的时候会到std命名空间里找。

Windows下VSCode C/C++代码跳转配置全解析:从编译器到语言服务器 代码跳转是集成开发环境的核心功能之一,它依赖于语言服务器对代码结构的深度理解。在C/C++这类编译型语言中,语言服务器需要准确获取编译器的路径、头文件包含目录和预定义宏等信息,才能构建精确的符号数据库。对于开发者而言,稳定的代码跳转能极大提升代码阅读和重构效率,尤其在大型项目或跨平台开发场景中。在Windows平台上,由于MSVC、MinGW、Clang等多种编译器生态并存,以及路径风格和构建系统的差异,配置过程往往比Linux或macOS更复杂。本文以VSCode的C/C++扩展为例,深入解析如何通过正确 阅读详情

相关推荐

为各位学弟学妹整理的C语言/C++相关笔试面试题

1 变量的声明和定义有什么区别 变量的定义为变量分配地址和存储空间, 变量的声明不分配地址。一个变量可以在多个地方声明, 但是只在一个地方定义。加入extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。 说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。 intmain() { externintA; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去...

编程与实战的博客 7685

C/C++相关知识点储备

1.c++虚函数原理 智能指针 c语言如何实现c++对象以及私有成员 c++多态实现 new和malloc的区别以及底层实现原理 STL中的vector怎么扩容 虚函数指针的初始化过程 c++11原子变量介绍 c++11特性有哪些,说用过的 怎么理解重载与重写 怎么理解c++中的static关键字 vector和list 的区别 c++的内存分配 map与set的底层实现 类静态变量的初始化 析构...

GUO-QI的博客 7727

本地化部署dify,使用Database插件实现dify直连数据库报错No module named ‘MySQLdb‘解决方案

网上查阅各种资料,有说修改/dify-main/docker/volumes/sandbox/dependencies目录下的python-requirements.txt文件,添加了如下两行,试验后无效。,看到有人是其他报错,但是URI配置如下(在mysql后面加了pymysql),尝试后果真成功了。按照系统提示设置完数据库URI后保存出现错误。在工具市场查询Database,点击后进行授权。最后在该插件的项目地址获得灵感。

qiaoxu1989的博客 4333

C/C++基础知识点

静态区域:全局变量、静态变量、常量。堆:动态分配的内存(通过mallocnew等)。栈:函数局部变量、函数调用信息。每个区域的存储方式和管理方式有所不同,栈和堆是由程序运行时进行管理的,而静态区域则在程序启动时分配并在程序退出时释放。特性全局变量静态变量常量定义位置函数外部定义函数内部或外部使用static关键字声明使用const关键字或#define定义生命周期程序从开始到结束程序从开始到结束程序从开始到结束作用域程序中的任何地方都可以访问仅限于函数或源文件仅限于其声明的作用域。

@宁兰 的博客 1107

从理论到波形:NE555多谐振荡器设计与示波器实战验证

本文详细介绍了NE555多谐振荡器的设计原理与实战验证方法。从基础理论到电路参数计算,再到面包板搭建与示波器测量,全面解析如何利用NE555芯片实现稳定的方波输出。通过实际案例演示了频率调整、占空比优化等技巧,并提供了常见问题排查指南,帮助电子爱好者快速掌握这一经典电路设计。

weixin_29159613的博客 281

复现HumanMAC(HumanMAC: Masked Motion Completion for Human Motion Prediction)

Human3.6M和HumanEva-I都放到data目录下(记得将data_multi_modal-20250320T022408Z-001.zip和humaneva_multi_modal-20250320T022412Z-001.zip解压缩并且分别重命名为data_multi_modal和humaneva_multi_modal)。生成的gif存放在inference目录下zero_shot_<INDEX>下的out目录下。新建一个data目录,将

qq_52643100的博客 831

【C/C++】从初始化到类型

  在 C++中,如果没有user-declared,class type会由编译器自动生成的函数有:default ctor、copy ctor、destructor和operator=(本文暂时不考虑move semantics)。当然,这些函数是在实际运行过程中调用到它们的时候再由编译器生成实际的代码再去执行,而非在编译这些class type class时直接生成在类的代码块内。   前三个函数其实很好理解,它们分别负责一个对象的产生和消亡。其中,default ctor的特点是:函数的括号内不接收

Undefined ZONE 693

DINOv3实战指南:如何利用零样本视觉模型革新工业质检

本文详细介绍了如何利用DINOv3零样本视觉模型革新工业质检流程。通过无需标注数据的自监督学习技术,DINOv3能快速部署高精度检测系统,显著降低成本和提升效率。文章涵盖模型选型、数据准备、实时检测优化及典型行业解决方案,为工业质检提供革命性AI实践指南。

ansible6ops的博客 123

C++ 学习笔记(一)(标准库类型 vector、string 篇)

前言:主要是自己学习过程的积累笔记,所以跳跃性比较强,建议先自学后拿来作为复习用。

张小艾博客 1524

【ECCV 2024】动态范围直方图自注意力DHSA,即插即用!

直方图自注意力机制,将空间特征按强度分段并进行分组,然后在各个分组内或分组间应用自注意力,以选择性地关注具有动态范围的空间特征,并处理长距离内相似退化的像素。

qq_43303160的博客 1844

Allegro16.6详细教程(二)

3-D Viewer,可以直接在allegro中看到board file的3-D顯示效果。3-D Viewer對於PCB Editor Products,只有環境變數中的OpenGL顯示功能開啟後才有效,而對於APD/SiP是無效的。2.3-D viewer是在一個獨立的視窗中打開的。3-D environment環境支援多種顯示內容的過濾,取景視角和顯示效果的選項,透過遊標可以直接控制放大,移動,翻轉等操作。

axingxiansen的博客 1917

c++ vector 初始化_《C++ Primer》学习之路第3章-3.3标准库类型vector

简介标准库类型vector表示对象的集合,其中所有对象的类型都相同。集合中的每个对象都有一个与之对应的索引,索引用于访问对象。 因为vector“容纳着”其他对象,所以它也常被称为容器。 想用vector,必须包含适当的头文件。#include C++既有类模板也有函数模板,其中vector是一个类模板。只有对C++有了相当深入的理解才能写出模板。 模板本身不是类或函数,相反可以将模板看坐为编译器...

weixin_39805409的博客 201

Chrome DevTools MCP 实战完整教程

本教程介绍了Chrome DevTools MCP(Model Context Protocol)在智能Web测试中的应用。该系统通过MCP协议将Chrome开发者工具能力标准化,并与AI结合,提供了统一的测试解决方案。核心功能包括智能自动化、深度调试分析和性能监控优化。教程详细讲解了环境搭建、MCP服务器配置、参数说明及多种工具集(输入自动化、导航、设备仿真、性能分析等)的使用方法。通过mcp-use库的MCPAgent和MCPClient组件,用户可以轻松实现自然语言驱动的浏览器操作和测试流程管理。

blues_C的博客 3804

学习 C/C++ 标准库类型vector 详解

默认初始化vector对象,创建一个制定类型的空vector;//默认初始化,svec不含任何元素;空vector可以在程序运行时很高效地往vector对象中添加元素。实际上,最常见的方式就是先定义一个空的vector,然后当运行时获取元素的值后再逐一添加。//正确 直接初始化,初始状态为空。//添加值给ivec。//正确 ivec拷贝初始化给ivec。//正确 第二行与第三行等价。//错误 svec的对象是string,不是int。

WWester的博客 373

FAST-LIVO2 源码精读(十八):实时性优化、漂移排查与工程落地

FAST-LIVO2 的工程价值,不在于某一个孤立的技巧,而在于它把"激光的几何精度、惯性的高频预测、视觉的纹理与色彩"用一套简洁的滤波框架紧紧拧在一起,又在实时性、鲁棒性、可扩展性之间取得了难得的平衡。先用内建计时表定位瓶颈,再按降采样、并行、滑窗、编译优化、双频输出逐项加速;遇到漂移先看现象、循诊断树定位根因、回到对应章节取解法。十八篇至此收束。

PX4-SLAM-PNC 216

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)

我们前面介绍了vector容器的概念以及对其基本使用进行了介绍,如果你在这里不知道vector是什么以及不知道如何使用的话,可以进入本人主页,在C++专栏里有介绍为了对小白友好,在这我简单介绍一下C++中的vector是一个动态数组容器,可以存储不同类型的元素。它提供了一系列的成员函数来方便地操作和管理数组。动态大小:vector的大小可以根据需要动态调整,可以在运行时添加或删除元素。随机访问:可以通过索引直接访问vector中的元素,支持常数时间的随机访问。

RO-BERRY 1887

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

vector类,so easy!

vector这个类就是属于STL的一部分,vector在这里是一个类类型的模板,简单来说,vector就是我们之前所学过的顺序表这个数据结构。

2301_81390458的博客 2899

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

2024-11-13-C++ 学习:数组和vector+术语表( Primer 第三章)(3)

数组和vector+术语表

weixin_42269028的博客 986

C++ vector初始化:从for循环到std::iota的优雅实践

在C++编程中,容器初始化是基础且关键的操作,它直接影响代码的性能和可读性。std::vector作为最常用的动态数组容器,其初始化方式的选择体现了开发者对标准库的掌握程度。从内存管理的原理来看,不当的初始化会导致不必要的内存重新分配和性能开销。现代C++提倡使用标准库算法替代手写循环,这不仅提升了代码的简洁性,还能借助编译器的优化获得更好的执行效率。std::iota算法正是这一理念的典范,它能高效、清晰地生成连续数值序列。在实际工程中,结合reserve进行内存预分配,可以避免动态增长带来的成本。这些技

455

【C/C++】std::vector成员函数清单

std::vector 成员函数清单

YZJincsdn的博客 1407

C++ vector未初始化异常:从原理到实战调试全解析

在C++编程中,内存管理和对象生命周期是核心基础概念。vector作为STL中最常用的动态数组容器,其内部通过连续内存块实现元素存储,并自动管理内存分配与释放。理解vector的初始化机制对于编写健壮代码至关重要——这不仅涉及内存的正确分配,更关系到迭代器有效性、状态机完整性等底层原理。未初始化的vector指针或引用会导致访问冲突、段错误等未定义行为,这类问题在大型项目、多线程环境或动态链接库交互中尤为隐蔽。通过系统性的编码规范、现代C++特性(如智能指针、optional)以及AddressSaniti

weixin_33850890的博客 318

蓝桥杯竞赛向(C/C++语言)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

weixin_62188419的博客 2822

C++ vector介绍

C++ vector介绍

2402_86037826的博客 1407

C++ vector 的相关基本操作

初始化 vector vector  a (10)  //初始化一个vector 变量a,有10个元素,每个元素为0 vector a(10,90)//初始化一个vector 变量a,有10个元素,每个元素为90 访问vector: 1 下标,像数组一样访问vector  a (10) ; a[0]=4//将第一个元素赋值为4 2 .at()方法 a.at

baiyu9821179的专栏 727

C++标准库类型vector

文章目录前言一、vector是什么?二、定义和初始化vector对象1.初始化vector对象的方法2.读入数据总结 前言 这里是对c++标准库类型Vector的用法和相关操作的部分小结。 一、vector是什么? 标准库类型vector表示对象的集合 ,其中所有对象的类型都相同。集合中的每一个对象都有一个与之对应的索引,索引用于访问对象。由于vector“容纳着”其他对象,所以它常被称作容器(container)。 二、定义和初始化vector对象 1.初始化vector对象的方法 定义和初始化.

drsker的博客 1422

c/c++数组解析(包含多维,动态分配,vector,不断更新)

所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。

bhtnb的博客 752
上一篇: C/C++相关概念和易错知识点(33)(string的模拟实现)
下一篇: C/C++相关概念和易错知识点(35)(sort、vector模拟实现)
-SGlow-
博客等级 码龄3年 1513粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值