C++中之---数组和vector
本文基于邓俊辉编著《数据结构(C++语言版)(第3版)》、《C++ Primer(第5版)》以及网上的相关博文而写,博主水平有限,若有不妥处,欢迎指出。
一、数组
C++中数组是一种内置的数据类型。
数组是存放类型相同的对象的容器,数组的大小确定不变,不能随意向数组中增加元素。
1、定义和初始化内置数组
(1)数组的大小不变,(a[d],d为数组的维度),数组的维度必须是一个常量表达式。定义数组的时,必须指定数组的类型和大小。
(2)初始化时,允许不指明数组的维度,不指明维度,则编译器根据数组初始值的大小推测出维度;若指定维度,则初始值的个数要小于等于维度,当小于时,不足的部分为0(其实还是等于维度)。
1 int a[]={1,2,3}; //数组a的大小为3; 2 int a[5]={1,2,3}; //等价于{1,2,3,0,0},大小为5 3 int a[5]={1,2,3,4,5,6}; //错误,初始值过多
还有一种特殊的情况:字符数组。当用字符串字面值去初始化数组时,要注意字符串字面值的后面还有一个空字符。也就是说,数组的大小要等于字面值的大小加1。
特别注意:不允许拷贝和赋值------不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值。
1 int a[]={1,2,3}; 2 int a2[]=a; //错误 3 a2=a; //错误
2、访问数组元素
数组的索引是从0开始,如:包含10个元素的数组a,其索引是从0到9而非1到10,若是a[10]则下标越界。
另外,使用数组下标时,其类型是size_t,在头文件cstddef中。
二、向量
C++中vector为类模板。
vector是类型相同的对象的容器,vector的大小可以变化,可以向数组中增加元素。
1、定义和初始化vector对象
初始化的方式比较多,有如下几种:
1 vector<T> v1; //v1为空,执行默认初始化 2 vector<T> v2(v1); //v2中包含v1所有元素的副本 3 vector<T> v2=v1; //等价于v2(v1) 4 vector<T> v3(n,val); //v3中包含n个重复元素,每个元素的值都是val 5 vector<T> v4(n); //v4包含n个重复执行了值初始化的对象 6 vector<T> v5{a,b,c...}; //包含初始化元素个数,每个元素被对应的赋予相应的值 7 vector<T> v5={a,b,c...}; //等价v5{a,b,c...}
注意事项:
(1)vector<T> v1,只用默认初始化时,不能通过下标进行添加元素。也就是说,当你将v1初始化为空时,假如你想向v1中添加10个元素,不能通过v1[2]=3;等形式添加,因为,别人为空,压根不知道v1[2]是什么东东。
(2)注意vector<T> v4(n)和vector<T> v4{n}的区别。前者说的是,v4中有n个相同的元素,至于值为多少要看相应对象的初始化值;而后者,则是说v4中只有一个元素,其值为n。
(3)不能使用包含着多个值的括号去初始化vector对象。注意和或括号的区别。
1 vector<int> intV(1,2,3); //错误
2、向vector对象中添加对象
利用vector的成员函数push_back向其中添加对象:
1 vector<int> v; 2 for(int i=0;i !=100;++i) 3 { 4 v.push_back(i); 5 }
注意:
若是循环体内包含想vector对象添加元素的语句,则不能使用范围for循环。因为范围for语句不应改变其所遍历序列的额大小。原因如下:
1 vector<int> v={1,2,3,4,5,6,7,8,9};2 for(auto &r: v)3 {4 r*=2;5 }6 7 等价于8 for(auto beg=v.begin(),end=v.end();beg !=end;++beg)9 { 10 auto &r=*beg; 11 r*=2; 12 }
即在范围for语句中,预存了end()的值,一旦在序列中添加(删除)元素,end函数的值就可能变的无效了。
3、vector的扩容、插入和删除
(1)扩容
vector的底层数据结构时数组。
当vector中的可用空间耗尽时,就要动态第扩大内部数组的容量。直接在原有物理空间的基础上追加空间?这不现实。数组特定的地址方式要求,物理空间必须地址连续,而我们无法保证其尾部总是预留了足够空间可供拓展。一种方法是,申请一个容量更打的数组,并将原数组中的成员都搬迁至新空间,再在其后方进行插入操作。新数组的地址由OS分配,与原数据区没有直接的关系。新数组的容量总是取作原数组的两倍。
(2)插入和删除
插入给定值的过程是,先找到要插入的位置,然后将这个位置(包括这个位置)的元素向后整体移动一位,然后将该位置的元素复制为给定值。删除过程则是将该位置以后的所有元素整体前移一位。
(2)vector的size和capacity
size指vector容器当前拥有的元素个数,capacity指容器在必须分配新存储空间之前可以存储的元素总数,capacity总是大于或等于size的。
三、数组与vector的对比
1、内存中的位置
C++中数组为内置的数据类型,存放在栈中,其内存的分配和释放完全由系统自动完成;vector,存放在堆中,由STL库中程序负责内存的分配和释放,使用方便。
2、大小能否变化
数组的大小在初始化后就固定不变,而vector可以通过push_back或pop等操作进行变化。
3、初始化
数组不能将数组的内容拷贝给其他数组作为初始值,也不能用数组为其他数组赋值;而向量可以。
4、执行效率
数组>vector向量。主要原因是vector的扩容过程要消耗大量的时间。
效率排序依次是数组>动态数组>预先reverse的vector>vector。总之,数组和容器各有千秋,若硬件速度够快,对时间要求不那么高,用容器方便,也未尝不可。关键看你,看中什么,是效率还是方便
转载:https://www.cnblogs.com/love-yh/p/7410666.html
C++中之---数组和vector相关推荐
- C++中的数组array和vector,lambda表达式,C字符串加操作,C++中新类型数组(数组缓存),多元数组,new缓冲
使用C++风格的数组,不需要管理内存. array要注意不要溢出,因为它是栈上开辟内存. array适用于任何类型 #include<iostream> #include<ar ...
- C++中 二维可变长数组,vector维度的获取
最近在leetcode练习算法,想用C但是很多简便的功能C都没有, 于是用C++,但是leetcode中,数组给的都是vector,哪怕是二维 就给vector<vector<int> ...
- C++中的可变长数组(vector)
变长数组vector vector译为向量,一般来说也叫变长数组,也就是长度可以任意变化的数组,有些题目需要开很多数组,往往造成内存超限,使用vector简单方便,还可节省空间. 头文件 vector ...
- 4-C++ 中string类、bool类型、模板、array数组、vector向量的基础知识
目录 继续C++ ------3 ++操作符的友元函数重载 ++操作符的成员函数重载 赋值运算符重载 类型转换运算符 运算符重载注意事项 string类 bool类型的练习 模板 1.函数模板 2.类 ...
- FPGA的设计艺术(18)如何使用Verilog中的数组对存储器进行建模?
前言 Verilog中的二维数组很有用,可以使用for以及generate for配合二维数组进行使用,可以代替大量寄存器的场合,其实大量同类寄存器可以使用存储器进行代替,Verilog中可以使用二维 ...
- 如何在C ++中使用数组?
C ++从C继承了数组,几乎可以在任何地方使用它们. C ++提供了更易于使用且不易出错的抽象(自C ++ 98起为std::vector<T> std::array<T, n> ...
- C语言中动态数组的作用,C语言实现动态数组
前言 在纯C语言编程中,数组的创建必须是固定的大小,因为C语言本身没有提供动态数组这种数据结构,这是一个让习惯了使用高级语言编程的人转做C开发面临的一个很头疼的问题,本篇文章就将介绍如何使用纯C语言编 ...
- MFC中动态数组CArray的使用
MFC中动态数组CArray的使用 2010-04-27 10:21 数组--这个C语言中的怪物,自从被直接继承到C++中,便让无数有识之士们前赴后继.绞尽脑汁,试图寻找一种可以动态增长的替代数据类型 ...
- c++ stl队列初始化_创建一个向量,并将其像C ++ STL中的数组一样初始化
c++ stl队列初始化 向量是什么? (What is the vector?) Vector is a container in C++ STL, it is used to represent ...
最新文章
- 李彦宏再提自动驾驶:是时候推动无人车商用了
- 数据中心机房夏日降温措施
- 《2020年AI新基建发展白皮书》重磅发布,展示百度智能云多个落地案例
- kubernetes-Pod结构
- 8-Python3从入门到实战—基础之数据类型(集合-Sets)
- 如何理解 ListT和 DictionaryK,V 的扩容机制 ?
- 风投的钱都从哪里来?
- [摘录]调动员工积极性的七个关键
- java将excel转换成txt_java将excel文件转换成txt格式文件
- slots游戏html5开发,unity自定义游戏框架Custom Slots fr amework 1.4
- Sublime text 2 无需注册码的破解方法,只改2个字节
- ps快速抠图 PS抠白底图
- 报错:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
- php市场占比 2019,2019年家电市场份额占比排名
- [SOA介绍]什么是SOA?
- CSS3 3D transform
- IOS10.3.0~10.3.3不完美越狱
- 在没SQL Server数据库情况下怎么打开.MDF文件?
- 【Python ----代码规范 】
- 【附源码】计算机毕业设计SSM小区停车计费管理系统
热门文章
- python 一个简单的天气预报程序
- protobuf序列化协议python教程
- docker教程,dockerfile教程
- matlab2c使用c++实现matlab函数系列教程-raylpdf函数
- 基于Arduino和Blynk平台的远程控制智能小车
- css制作tips提示框,气泡框,制作三角形
- Python3.5 学习八 附加知识点 paramiko和rsa非对称秘钥的适用
- TeeChart的坐标轴
- nginx添加nginx_mod_h264_streaming-2.2.7模块编译报错
- spring+hibernate的clob大字段处理