C++primer(第五版)第三章中标准库类型Vector、迭代器和数组
来源:互联网 发布:java自带线程池实例 编辑:程序博客网 时间:2024/04/28 10:33
标准库类型vector:
引用vector,则首先需要引进它的头文件#include<vector>,作用:它类似与一个动态数组;
用法的例子:
vector<T> v1; //v1是空vector,元素类型为T(int,string,vector等类型)
vector<T> v2(n,val); //v2中有n个重复的元素,每个元素的值为val;
vector<T> v3{a,b,c,d...}; //v3包含了初始值个数的元素,每个元素被赋予相应的初始值;
数据例子:目的方便读者更加清晰的理解上面的定义!
vector<int> v1(10); // 10个元素,每个都初始化为0;
vector<int> v2(10,1); //10个元素,每个的值为1;
vector<int> v3{10}; //有一个元素,该元素的值为10;
vector<string> v4(10,"hi"); //有10个元素,每个都初始化为“hi”;
vector<string> v5{10,"hi"}; //该类与上面的区别:花括号里的值必须与元素类型相同,显然10是int类型,就不能作为元素的初始化值,从而编译器会尝试默认初始化vector对象,从而变成为10个“hi”的元素;(花括号的vector初始化都是C++11特性)
vector支持的操作:
vector<T> v; //定义v为T类型;
v.empty(); //如果v不含任何元素返回真,否则为假!;
v.size(); //返回v中元素的个数;
v.push_back(t); //向v的尾端添加一个值为t的元素;
<,<=,>,>= ; // 以字典顺序进行比较(类似上次笔记string比较);
下面还需要讲解有关vector的下标操作:(注意与c语言数组运用有点的区别)
使用下标的时候必须清楚它是否在合理的范围之内(尽可能使用使用for语句)。不能用下标形式去添加元素。(这与c语言的数组添加不同)
例子:
vector<int> ivec; //空vector对象;
for(decltype(ivec.size()) ix=0;ix!=10;ix++)
ivec[ix]=ix; //错误,ivec不包含任何元素;
cout<<ivec[0]; //该语句也是错误的;
显然我们知道c语言是可以用下标去执行该功能的;不能的原因:ivec是一个空对象,根本不包含任何元素,当然也就不能通过下标去访问任何元素!正确的方法应该是使用push_back(上面有它的介绍);
迭代器的简单介绍(后面章节还有大量的有关迭代器问题):
迭代器提供了对对象的间接访问:迭代器可以访问某个元素,也能从一个元素移到下一个元素。
begin成员负责返回第一个元素的迭代器,end是返回尾元素的下一个位置的迭代器(一个不存在的“尾后”,特别注意end迭代器由于并不实际指示某个元素,所以不能对其进行递增或解引用的操作)。
迭代器的运算符号:
*iter 返回迭代器iter 所指元素的引用;
iter->men 解引用iter并获取该元素的名为men的成员,等价于(*iter).men ;
vector和string迭代器支持的运算:
iter+n,iter-n,iter+=n,iter-=n,iter1-iter2,>,>=,<,<=
很显然迭代器的 这些运算我们都比较熟悉,和c语言数组的下标(指针)类似,就不具体详解;注意一下二分法中迭代器mid=s.begin()+(s.end()-s.begin())/2;我们很清晰的能够感到似曾相识的感觉(c语言指针运算);
数组:(和c语言数组一样)
复习复合数组的声明:
int (*parry)[10]=&arr; //parry指向一个含有10个整数的数组;
int (&arrRef)[10]=arr; //arrRef引用一个含有10个整数的数组;
int *(&arry)[10]=ptrs; //arry是数组的引用,该数组含有10 个指针;
要想数组的声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读。
数组和c语言中的都类似,不同的是C++中有了begin和end数组指针,也是迭代器;c语言数组用的下标(指针)访问和添加元素;
总结C++11特性:
1.花括号对vector对象进行初始化;(上面有详细的讲解)
这里对编译器也有要求需要支持C++11特性的编译器;否则就回编译错误; vector<string> v1{"a","an","the"};该语句用一般编译器通不过;
2.cbegin和cend:
cbegin和cend的类型都是const_iterator,它们与begin和end类似,唯一不同的是不论vector对象(或string对象)本身是否是常量,返回值都是const_iterator.
const_iterator类型只能读字符(元素),不能写字符(元素);
3.数组中的begin和end:
这两个函数与容器中的两个同名成员功能类似,不过数组毕竟不是类类型,因此这两个函数不是成员函数。和c语言数组的下标功能一样;(上面也有提到)
4.auto和declytype(上一个学习笔记做了详细介绍)
简单复习一下:auto由后面的计算结果决定声明的类型;declytype(A)B根据A的类型声明成B的类型;
vector和迭代器后面会有大量章节介绍vector的访问、删除和插入等问题,暂时只是对他们有一个初步的了解;特别注意迭代器中的细节问题,比如begin和end的具体位置指向;
- C++primer(第五版)第三章中标准库类型Vector、迭代器和数组
- c++ primer第五版(中文)习题答案 第三章第二节-标准库类型string
- 《C++Primer》 第三章 标准库类型
- C++primer第三章:标准库类型
- C++ Primer 第三章 标准库vector类型
- 《C++ Primer》读书笔记-第三章 03 标准库类型vector
- 《C++ Primer》读书笔记第三章-2-标准库类型vector
- C++primer第4版第三章标准库类型
- C++Primer 学习笔记 第三章(标准库类型)
- C++primer 3.3 标准库类型 vector
- c++primer学习笔记(3.3)标准库vector类型
- c++primer 第三章数组 string vector
- 第三章:标准库类型:string、 vector 和 bitset类型
- C++Primer笔记 第三章 标准库类型
- C++primer学习笔记-第三章标准库类型
- 《C++primer》标准库类型 数组和指针
- 【C++ Primer】【学习笔记】【第三章】标准库类型之:vector类型
- 《C++primer(第五版)》学习之路-第三章:字符串、向量和数组
- 制作iOS温度计应用:图片拉伸函数:resizableImageWithCapInsets
- i os 程序文件目录的操作
- poj 1450--Gridland
- 作业调度框架 Quartz.NET 2.0 教程
- UILabel 的使用 及文字效果
- C++primer(第五版)第三章中标准库类型Vector、迭代器和数组
- poj 1450---Gridland
- Quartz.NET 2.0 作业调度框架使用
- UIPageControl 改变点的颜色
- Ubuntu12.04安装java6
- IOS@property参数详解
- Jlink Commander解锁Jlink
- Linux使用技巧
- 从2015年2月1号起。。上传APP store就要支持64位