标准库类型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++系统学习之三:向量的更多相关文章

  1. 【SQL Server】系统学习之三:逻辑查询处理阶段-六段式

    一.From阶段 针对连接说明: 1.笛卡尔积 2.on筛选器 插播:unknown=not unknuwn 缺失的值: 筛选器(on where having)把unknown当做FALSE处理,排 ...

  2. 【mongodb系统学习之三】进入mongodb shell

    三. 进入mongodb shell(数据库操作界面) : 1).在mongodb的bin目录下输入./mongo,默认连接test数据库,连接成功会显示数据库版本和当前连接的数据库名,如图: 2). ...

  3. Linux学习之三-Linux系统的一些重要配置文件

    Linux学习之三-Linux系统的一些重要配置文件 1.网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0 说明: DEVICE=eth0        ...

  4. 零基础如何系统学习Java Web

    零基础如何系统学习Java Web?   我来给你说一说 你要下决心,我要转行做开发,这样你才能学成. 你要会打字,我公司原来有一个程序员,打字都是两个手一指禅,身为程序员你一指禅怎么写出的代码,半个 ...

  5. Unity3D 装备系统学习Inventory Pro 2.1.2 基础篇

    前言 前一篇 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 基本泛泛的对于Inventory Pro 这个插件进行了讲解,主要是想提炼下通用装备系统结构和类体系.前两天又读 ...

  6. MES系统学习

    MES系统是当今制造型企业信息化的热点,而统一建模语言UML是面向对象建模的标准语言,在软件工程发挥着重要作用.MES系统如何进行UML建模呢,今天和大家重点讨论一下MES系统的UML建模方法,请看本 ...

  7. AspectJ基础学习之三HelloWorld(转载)

    AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...

  8. 001 今天开始系统学习C#

    2016-01-16 之前只是大概了解过c#语言,感觉掌握不牢靠.现在开始系统学习C#.现以该博客作为学习笔记,方便后续查看.C# 目标:系统掌握c#知识 时间:30天 范围:C#基础,Winform ...

  9. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

随机推荐

  1. java多线程中用到的方法详细解析

    在多线程学习的过程中涉及的方法和接口特别多,本文就详细讲解下经常使用方法的作用和使用场景. 1.sleep()方法.      当线程对象调用sleep(time)方法后,当前线程会等待指定的时间(t ...

  2. RN初始化项目报错

    解决方法:全局删除yarn

  3. AKOJ-2010-魔法石

    链接:https://oj.ahstu.cc/JudgeOnline/problem.php?id=2010 题意: Vyoung最近收集到一大批魔法石,这些魔法石有两种特性,攻击和防守,不同特性的两 ...

  4. HDU6441(费马大定理)

    听队友说过结论:a^n + b^n = c^n在n > 2时无解. 勾股那里本菜数学不好直接暴举了Orz. 跟大家学一波勾股数的构造:a是奇数时,tmp = a / 2; b = (tmp + ...

  5. POJ1470 LCA (Targan离线)

    bryce1010模板 http://poj.org/problem?id=1470 /*伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u,v) ...

  6. Mysql之Union用法

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MYSQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后 ...

  7. AJPFX关于collection总结

    Collection接口是该层次结构的根接口,该接口的所有子接口或实现子类集合都可以用Iterator迭代器进行取出.Collection有两个常见子接口,即为List和Set,其中List集合可以用 ...

  8. mac系统连接Android手机

    1. 打开终端,输入:system_profiler SPUSBDataType,查看Mac系统所有USB设备信息,找到相应的厂商Vender ID 2.输入echo "Vender ID& ...

  9. Linux下的I/O复用

    读书笔记 I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要. Linux下实现I/O复用的系统调用主要有select, poll, epoll. select: 用户通过3个参数 ...

  10. 大数据freestyle: 共享单车轨迹数据助力城市合理规划自行车道

    编者按:近年来,异军突起的共享单车极大地解决了人们共同面临的“最后一公里”难题,然而,共享单车发展迅猛,自行车道建设却始终没有能够跟上脚步.幸运的是摩拜单车大量的轨迹数据为我们提供了一种新的思路:利用 ...