标准库类型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 web(转)

    转自 http://www.oschina.net/question/12_52027 OSCHINA 软件库有一个分类——Web框架,该分类中包含多种编程语言的将近500个项目. Web框架是开发者 ...

  2. 有趣的JS存储 连等问题

    五个月不见了,你是不是和我一样又帅了,今天我们先来看一道经典的关于JS存储的题目,来一场紧张又刺激的脑内吃鸡大战吧: var a = {n:1}; a.x = a = {n:2}; console.l ...

  3. localStorage和sessionStorage使用

    localStorage.setItem("key","value");//存数据 localStorage.getItem("key"); ...

  4. [题解](树的计数)luogu_P4430猴子打架_/_luogu_P4981父子

    来源:题解 比较不错的博客:http://www.cnblogs.com/dirge/p/5503289.html 最后生成一颗无根树,有n^(n-2)种情况,打架的顺序有(n-1)!种 #inclu ...

  5. Codeforces Round #533(Div. 2) A.Salem and Sticks

    链接:https://codeforces.com/contest/1105/problem/A 题意: 给n个数,找到一个数t使i(1-n)∑|ai-t| 最小. ai-t 差距1 以内都满足 思路 ...

  6. Codeforces 1139E(二分图最大匹配)

    pi只有0-5000且只找最小的没出现的,又要找不同club的,考虑二分匹配,左边pi,右边ci,一个匹配一个.离线倒着加边即可. const int maxn = 5e3 + 5; int m, n ...

  7. [android][avd位置修改][需自己手动]

    1.找到avd目录(C:\的那个)并打开,移动.avd文件到需要的位置. 2.修改ini文件path,完成.

  8. 回顾Quick Sort(Javascript 实现)

    Introduction QuickSort的时间复杂度渐近函数虽然不能达到MergeSort般的O(nlgn),但因其良好的时间常量以及平均运行时间而被广泛使用. 下图解释了QuickSort的过程 ...

  9. [转]AngularJS Cookies Example

    AngularJS Cookies Example AngularJS 提供了很好的 $cookie 和 $cookieStore API 用来处理 cookies . 这两个服务都能够很好的发挥HT ...

  10. 【algorithm】二叉树的遍历

    二叉树的遍历 二叉树用例 代码解析: public class BinaryTree { static class TreeNode { Integer val; TreeNode left; Tre ...