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并 ...
随机推荐
- [Xcode 实际操作]九、实用进阶-(4)计算两个日期间的差值
目录:[Swift]Xcode实际操作 本文将演示如何计算两个日期之间的差值. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class ...
- ASPNET-ASPNETCORE 认证
话题背景 关于认证我的个人理解是,验证信息的合法性.在我们生活当中,比如门禁,你想进入一个有相对安全措施的小区或者大楼,你需要向保安或者门禁系统提供你的身份信息证明,只有确定你是小区业主,才可以进来, ...
- 学习Mahout(三)
开发+运行第一个Mahout的程序 代码: /** * Licensed to the Apache Software Foundation (ASF) under one or more * con ...
- log4j和log4j2怎么动态加载配置文件
应用场景与问题 当项目在运行时,我们如果需要修改log4j 1.X或者log4j2的配置文件,一般来说我们是不能直接将项目停止运行再来修改文件重新部署的.于是就有这样一个问题:如何在不停止当前项目的运 ...
- HDU 1875(最小生成树)
#include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...
- Codeforces 1132D(二分模拟)
要点 二分显然,关键在于怎么判断 题解方法:开k个队列代表每个时间有哪些电脑会挂掉,这部分O(n)预处理一下,之后扫一遍时间,每个时间点贪心选取最靠前的会挂的电脑未雨绸缪给它充电,然后看看充电以后要不 ...
- web基础笔记
浏览器渲染页面的过程 浏览器渲染页面前需要先构建 DOM 和 CSSOM 树.因此,我们需要确保尽快将 HTML 和 CSS 都提供给浏览器. 参考:https://developers.google ...
- Mex(线段树的巧妙应用)
题目要求求某段区间第一个没有出现的数(0,1,2,3....) ,对于所有的区间,我们把这样的数加起来最后得到一个结果. 首先,我们要求出这样的数,然后还得列举出所有的区间,复杂度太大了. 换种思路, ...
- sourceTree免注册免登陆使用方法-Windows
安装sourceTree需要注册Google账号,而现在国内注册账号需要FQ,超级麻烦,所以还是免注册的号. 处理方法: 解决办法 在目录C:\Users\{youruser}\AppData\Loc ...
- File "<stdin>" , line 1
写了一个hello.py,仅有一句,print 'hello world', 运行 Python hello.py 出错,提示: File "<stdin>" , li ...