教科书中失踪的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. Scalaz(49)- scalaz-stream: 深入了解-Sink/Channel

    一个完整的scalaz-stream有以下几个部分组成:Source -> Transducer -> Sink,用直白文字来描述就是:“输入 -> 传换 -> 输出”.我们已 ...

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

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

  3. [Cordova] Plugin开发入门

    [Cordova] Plugin开发入门 Overview Cordova的设计概念,是在APP上透过Web控件来呈现Web页面,让Web开发人员可以操作熟悉的语言.工具来开发APP.使用Web页面来 ...

  4. clicaptcha中文点击验证码开发经验总结

    现在的验证码真是越来越高级了,12306 的找图验证码,极验的拖动式验证码,还有国外的一些黑科技,能智能判断你是不是机器人的验证码. 验证码的更新迭代让我突然对传统验证码一下子不满足了,出于挑战自我和 ...

  5. js改变css样式的三种方法

    共用代码: <div id="div">this is a div</div> var div=document.getElementById('div') ...

  6. Muzli – 所有你需要的设计灵感都在这

    曾几何时,三个家伙一起工作,他们分享各种令人振奋的资源链接.然后,其中一个人有一个想法.一个绝妙的主意,是否可以有一种方式来与他人分享这些链接?因此, Muzli 诞生了.所有你需要的设计灵感这里都有 ...

  7. go语言 类型:整型

    整型是所有编程语言里最基础的数据类型.

  8. 详细解读XMLHttpRequest(一)同步请求和异步请求

    本文主要参考:MDN XMLHttpRequest 让发送一个HTTP请求变得非常容易.你只需要简单的创建一个请求对象实例,打开一个URL,然后发送这个请求.当传输完毕后,结果的HTTP状态以及返回的 ...

  9. 在内网中OWA第一次访问速度慢的问题

      当网络环境为内网时,有时访问OWA站点一直卡在Office Web App 那里. 这是因为SharePoint有一个证书需要联网检索 此环境为SharePoint 2013 通过下面的三个步骤 ...

  10. SharePoint 2010 常用技巧及方法总结

    1.代码调试确定进程cd c:\windows\system32\inetsrvappcmd list wppause注:保存成批处理文件,查看进程.bat,用的时候双击即可 2.类似列表新建打开方式 ...