C++系统学习之三:向量
标准库类型vector
定义:vector表示对象的集合,其中所有对象的类型都相同。
访问方式:索引
头文件:<vector>
本质:类模板
NOTE:
- 模板本身不是类或函数,相反可以将模板看作为编译器生成类 或函数编写的一份说明。
- vector是模板而非类型,由vector生成的类型必须包含vector中元素的类型,例如vector<int>
- vector只能容纳实体对象,不能容纳引用
1 定义和初始化vector对象
也允许把一个vector对象的元素拷贝给另外一vector对象,但两个vector对象的类型必须相同。
列表初始化vector对象
C++提供的几种不同的初始化方式,大多数情况下这些初始化方式可以相互等价地使用,但有三种特殊情况:
- 使用拷贝初始化时,只能提供一个初始值
- 如果提供的是一个类内初始值,则智能使用拷贝初始化或使用花括号的形式初始化
- 如果提供的是初始元素值的列表,则只能把初始值都放在花括号里进行列表初始化,而不能放在圆括号里
vector<string> v1("a","an","name"); //错误
vector<string> v2{"a","an","name"}; //列表初始化
创建指定数量的元素
vector<int> v(,-); //10个-1
vector<string> s(,"hi"); //10个string的hi
值初始化
通常情况下,可只提供vector对象容纳的元素数量而不用初始值,库会为每一个元素提供一个初始化值,这个值由vector中对象的类型决定。
vector<int> v(); //10个元素,每个初始化为0
vector<string> s(); //10个元素都初始化为空字符
NOTE:
初始化时,圆括号是用来构造vector对象的,如果是花括号则表示是列表初始化,但是如果无法执行列表初始化时将会考虑其他初始化方式。
vector<int> v1(); //v1有10个元素,每个值为0
vector<int> v2{}; //v2有1个元素,该元素的值是10 vector<int> v3(,); //v3有10个元素,每个元素的值都是1
vector<int> v4{,}; //v4有2个元素,值分别是10和1 vector<string> v6("hi"); //错误,不能使用字符串字面值构件vector对象
vector<string> v7{10}; //此时不能执行列表初始化,所以是直接初始化,v7有10个默认初始化的元素
2、向vector对象中添加元素
利用成员函数push_back();
3、其他vector操作
NOTE:
使用下标访问元素,必须要确保下标的合法性,只能对已经存在的元素执行下标操作,确保下标合法的一个有效手段就是尽可能使用范围for语句。
vector<int> v{ , , , , , , , , , };
for (auto &i : v)
{
cout << i << endl;
}
迭代器
除了使用下标来访问string对象的字符和vector对象的元素之外,还可以使用迭代器来达到同样的效果。
- 所有标准容器都可以使用迭代器,但只有少数几种才同时支持下标运算符
使用迭代器
迭代器和指针类似,都提供了对对象的间接访问,但也有区别。获取迭代器不是取地址符,有迭代器的类型同时拥有返回迭代器的成员。
- 如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器
- 使用auto来定义接收迭代器函数返回的迭代器类型
auto b=v.begin(), e=v.end();
迭代器运算符
迭代器相等的判定原则:两个迭代器指向的元素相同或者都是同一个容器的尾迭代器,则相等。
迭代器类型
iterator和const_iterator来表示迭代器的类型。const_iterator能读取但不能修改它所指的元素值。如果vector对象或string对象是一个常量,只能使用const_terator;如果vector对象或string对象不是常量,那么既能使用iterator也能使用const_iterator。
begin和end运算符
begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator,如果对象不是常量,返回iterator.
vector<int> v;
cosnt vector<int> cv;
auto it1=v.begin(); //it1的类型是vector<int>::iterator
auto it2=cv.begin(); //it2的类型是vector<int>::const_iterator
C++新标准引入了两个新函数,分别是cbegin和cend,不论对象本身是否是常量,返回值都是const_iterator.
结合解引用和成员访问操作
(*it).men
it->men //二者效果一样
某些对vector对象的操作会使迭代器失效
- 不能在范围for循环中向vector对象添加元素
- 任何一种可能改变vector对象容量的操作,都会使vector对象的迭代器失效
迭代器运算
C++系统学习之三:向量的更多相关文章
- 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式
一.From阶段 针对连接说明: 1.笛卡尔积 2.on筛选器 插播:unknown=not unknuwn 缺失的值: 筛选器(on where having)把unknown当做FALSE处理,排 ...
- 【mongodb系统学习之三】进入mongodb shell
三. 进入mongodb shell(数据库操作界面) : 1).在mongodb的bin目录下输入./mongo,默认连接test数据库,连接成功会显示数据库版本和当前连接的数据库名,如图: 2). ...
- Linux学习之三-Linux系统的一些重要配置文件
Linux学习之三-Linux系统的一些重要配置文件 1.网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 说明: DEVICE=eth0 ...
- 零基础如何系统学习Java Web
零基础如何系统学习Java Web? 我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...
- Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇
前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...
- MES系统学习
MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...
- AspectJ基础学习之三HelloWorld(转载)
AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...
- 001 今天开始系统学习C#
2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
随机推荐
- java后台杂记
1.在@Select使用动态SQL有 "<=" 时要转义:<![CDATA[ <= ]]> 2.assert函数即断言,也即做出一些假设,程序运行时如果假设 ...
- 【OpenJ_Bailian - 2287】Tian Ji -- The Horse Racing (贪心)
Tian Ji -- The Horse Racing 田忌赛马,还是English,要不是看题目,我都被原题整懵了,直接上Chinese吧 Descriptions: 田忌和齐王赛马,他们各有n匹马 ...
- JS中一个new到底做了哪些事情?
1.https://www.cnblogs.com/faith3/p/6209741.html 2.https://www.cnblogs.com/AaronNotes/p/6529492.html
- 虚拟机无法分配内存 virtual memory exhausted: Cannot allocate memory
1.内存交换空间(swap)的构建 安装Linux时一定需要的两个分区:根目录和swap(内存交换空间). swap的功能:在应付物理内存不足的情况下所造成的内存扩展记录的功能. 物理内存不足的时候, ...
- 数据库 | 远程连接centos7上数据库
用root身份进入远程服务器控制台: 进入Mysql命令: # mysql -uroot -p 或者在本地上连接到远程主机上的MySQL: 假设远程主机的IP为:10.0.0.1,用户名为root,密 ...
- php—常见设计模式
工厂模式 /** * 工厂方法或者类生成对象,而不是在代码中直接new * * 修改类名的时候,不需要每一个实例化语句都修改 * 只需要修改对应的工厂方法 * * Class Factory * @p ...
- 在 Linux 环境直接复移动硬盘上的 GRUB
手头有一块用了 10 年的旧移动硬盘,其中安装了 Debian 系统,从低版本一直升级到现在的 9 已经用了很长时间.前不久正连着那块硬盘跑着 Debian 修改文件的时候,由于一个本可避免的意外震动 ...
- 解决 openSUSE 中 Sublime Text 3 的中文显示和输入问题
测试环境 系统版本:openSUSE Leap 42.2 桌面环境:KDE Plasma 5输入法:fcitx-rime (中州韵) 见周围用 Windows 和 macOS 的小伙伴几乎都在用简单强 ...
- Java EE学习笔记(一)
spring入门程序: 1.导入Spring的4个基础包以及commons-logging的JAR包复制到lib目录中 2.src->com.itheima.ioc包下: ①UserDao.ja ...
- 模拟IO 读写压力测试
#### 本实验室通过创建一个测试表myTestTable ,分配在一个足够大小的表空间. ###然后通过 insert select 方式,创建100个后台进程进行读写操作,每个后台进程预计时间20 ...