教科书中失踪的vector

很奇怪的一件事情,在当时学习C++的时候,老师并没有讲授容器的内容,当时参考的谭浩强老师的红皮C++也没有这个内容,不知为何。后来再学C++,发现容器是一个很重要的概念,在C++primer中,大量使用了vector容器,在很多在线编程网站的题目中,也使用了vector<int>取代了整形数组。同样的,教材中也没有出现迭代器。

vector比数组好在哪?

vector和数组都是存储相同类型对象的容器。vector的大小变,数组大小固定不变,所以vector更加灵活。在不确定元素个数的时候,vector更适合。当元素个数确定时,可以使用数组。对于某些情况下,数组的性能可能更好一些。

使用vector

vector是标准库类型,需要包含适当的头文件。

#include<vector>
using std::vetor;

vector是类模板而非类型,必须实例化。

vector<int>

初始化vector

vector<T> v1;//空vector
vector<T> v1(v2);//v1是v2副本
vector<T> v2=v1;//与上等价
vector<T> v3(n,val);//n个元素,都是val
vector<T> v4(n);//n个元素,执行值初始化
vector<T> v5{a,b,c,.....}//列表初始化
vector<T> v5={a,b,c,...}//遇上等价

对vector操作

大多vector操作和string很相似

v.push_back(t);//追加元素到尾端

v.size();//返回元素个数

v.empty();//返回是否是空

v[n];//下标访问

//以及 ==,!=,>,>=,<,<=

注意:

  1. 不能用下标添加元素
  2. 只能对已存在的元素进行下标操作,否则会导致缓冲区溢出(buffer overflow,用下标访问不存在的元素)

使用迭代器

迭代器iterator的作用类似于指针,对对象间接访问。获取迭代器使用begin()与end(),注意,end返回容器尾部的下一位置。

获得迭代器与迭代器类型

auto b=v.begin();//auto是c++11的新类型说明符
vector<int>::iterator it1;//it是读写的迭代器,每个容器定义了一个迭代器
vector<int>::const_iterator it2;//it2只能读,不能写

迭代器运算

*it;//返回引用
it->mem//等价(*it).mem
//也有++,--,==,!=;
//有+n,-n,+=,-=;
it1-it2;//返回类型difference_type
//有>,<,>=,<=

迭代器的作用于指针类似,操作也类型于指针。

一个使用vctor与迭代器的二分搜索

vector<int>::const_iterator binarySearch(vector<int> &arr, int target)
{
vector<int>::const_iterator begin = arr.begin();
vector<int>::const_iterator end = arr.end();
vector<int>::const_iterator mid = begin + (end - begin) / ;
while (mid != end&&*mid != target)
{
if (target < *mid)
end = mid;
else
begin = mid + ;
mid = begin + (end - begin) / ;
}
return mid;
}

ps.看到有一种说法,迭代器是一种广义指针,也是有其道理的。

C++杂谈(二)初识vector容器与迭代器的更多相关文章

  1. 二维vector容器读取txt坐标

    template <class vector> struct HeadLocation{ vector x; vector y; }; vector<HeadLocation< ...

  2. STL之二:vector容器用法详解

    转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...

  3. vector容器+iterator迭代器

    关于vector容器的详细描述,可参考:http://www.jb51.net/article/41648.htm   关于iterator迭代器的描述,可参考http://www.cppblog.c ...

  4. STL学习二:Vector容器

    1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...

  5. STL学习系列二:Vector容器

    1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...

  6. C++STL(二)——vector容器

    STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...

  7. 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  8. C++(二)— STL容器的基本用法

    1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...

  9. 这么美的“vector容器”,你确定你不看吗?

    内容思维导图: 一.vector基本概念: 1.功能: vector数据结构和数组非常相似,也称为单端数组. 2.vector和普通数组的区别: 不同之处在于数组是静态空间,而vector是可以动态扩 ...

随机推荐

  1. Java的主要数据类型(Primitive)

    有一系列类需特别对待:可将它们想象成"基本"."主要"或者"主"(Primitive)类型,进行程序设计时要频繁用到它们.之所以要特别对待, ...

  2. Linux更改主机名--适用于Centos

    1.显示主机名: [root@bogon:~]# hostnamezhh64 2.临时修改主机名: [root@bogon:~]# hostname zzofs[root@bogon:~]# host ...

  3. jquery多次上传同一张图片

    $().reset(); wrap():$('p').wrap('div');===><div><p></p></div>; .closest() ...

  4. Oracle EBS Form Builder使用Java beans创建窗体

    最近有个项目,需要研究一下Oracle的E-Business Sutie(EBS),对于以前没接触此套件的我来说,简直太痛苦了.在网上找了一堆资料,试着进行Form二次开发,也遇到各类奇葩问题.目前遇 ...

  5. 携带cookie进行数据请求

    前端进行数据请求有:普通的ajax(json)请求,jsop跨域请求,cors跨域请求,fetch请求...PC端这些请求方式中,普通的ajax(json)请求和jsop跨域请求是默认携带cookie ...

  6. go语言 类型:布尔类型

    Go语言中的布尔类型与其他语言基本一致,关键字也为bool,可赋值为预定义的true和false示例代码如下: var v1 bool v1 = true v2 := (1 == 2) // v2也会 ...

  7. DirectX基础 常用函数语句

    DirectX常用函数语句 常用数学类函数: 计算向量的长度(模): FLOAT D3DXVec3Length(CONST D3DXVECTOR3* pV); 向量的规范化: D3DXVECTOR3 ...

  8. Android Handler机制(四)---Handler源码解析

    Handler的主要用途有两个:(1).在将来的某个时刻执行消息或一个runnable,(2)把消息发送到消息队列. 主要依靠post(Runnable).postAtTime(Runnable, l ...

  9. setRequestedOrientation设置屏幕方向

    void android.app.Activity.setRequestedOrientation(int requestedOrientation)   官方API解释:     Change th ...

  10. Android 常用数据适配器ArrayAdapter

    接着上篇文章<Android 采用Layout Inflater创建一个View对象>,本文采用常用数据适配器ArrayAdapter 新建项目后,在layout文件夹下新建list_it ...