vector的定义

vector是C++标准库里最常用的容器,它之所以被称为容器,是因为它可以存放多个对象,所有在用一个容器中的对象都应该具有相同的类型。

vector也是一个类模板,这也是它能存放多种类型元素的原因。关于类模板的知识,请参考我的另一篇文章:http://blog.csdn.net/larry233/article/details/50985945

初始化vector

  • vectorv1; // vector that holds objects of type T.Default constructor v1 is empty
  • vectorv2(v1); //v2 is a copy of v1
  • vectorv3(n,i);//v3 has n elements with value i
  • vectorv4(n); //v4 has n copies of a value-initialized object

示例如下:

vector<int>ivec1;
vector<int>ivec2(10); //该容器含10个元素,被默认初始化为0
vector<int>ivec3(10,1); //该容器里的10个元素均为1
vector<string>ivec4(10,"hi");//该容器里的10个元素均为“hi”

vector的操作

  • v.empty()//Returns true if v is empty,otherwise returns false
  • v.size()//Returns numbers of elements in v
  • v.push_back(t)//Adds element with elements in v
  • v[n]//Returns element at position n in v
  • v1 == v2//Returns true if v1 equals to v2

向容器中增加元素

示例如下:

string word;
vector<string>text;
while(cin>>word){
text.push_back(word);
} int i;
vector<int>ivec;
while(cin>>i){
ivec.push_back(i);
}

用数组下标访问vector中的元素

示例如下:

for(vector<int>::size_type ix = 0; ix != ivec.size(); ++ix)
cout<<ivec[ix]<" ";

迭代器

尽管我们可以使用数组下标来访问vector中的元素,但是标准函数库也提供了另一种访问、处理元素的方式,那就是迭代器(iterator)。迭代器使得编写与容器类型无关的泛型算法成为可能。

vector的迭代器的声明

vector<int>::iterator iter;

使用迭代器的示例如下:

for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0; //set element tp which iter refers to 0

const_iterator

如果我们不想改变迭代器指向的容器里的元素的值,我们可以使用const_iterator
示例如下:

for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
cout<<*iter<<endl; //only print each value in ivec

使用const_iterator后,任何试图改变容器内的值的操作都是错误的:

for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end(); ++iter)
*iter = 0; //error,*iter is const

const_iterator很容易和const iterator(const类型的iterator)搞混掉。我们可以这么理解:

const_iterator 类似于指向const类型变量的指针,而const类型的iterator类似于const pointer,即该iterator本身是const类型的。即:

//an iterator that can't write elements
vector<int>::const_iterator //an iterator whose value cann't change
const vector<int>::iterator

const iterator的示例如下:

vector<int>num(10);
const vector<int>::iterator cit = num.begin();
*cit = 1; //ok,cit can change its underlying element
++cit; //error,can't change the value of cit

由于const_iterator只能读取数据,因此它既能被用于const类型的vector,也能被用于non-const类型的vector。而const类型的iterator就显得”useless”了,因为一旦它被初始化,它就只能指向该元素,而不能指向其他元素。

const vector<int>nine(10,9);//cann't change elements in nines
//error:cit2 could change the element it refers to but nines is const
const vector<int>::iterator cit2 = nine.begin(); //ok:it cann't change an element value,so it can be used with a const vector<int>
vector<int>const_iterator it = nine.begin();
*it = 10;//error:*it is const
++it;//ok:it isn't const so we can change its value

iterator的算数运算

  • 迭代器只能与整数相加减,不能与迭代器相加,只能相减。比较属于两个不同容器对象的迭代器属于未定义的行为。如:

    iter + n

iter - n

iter1- iter2

相减运算不常见,不再赘述。

  • 更为实用的应用是直接对迭代器进行算数运算以改变它所指向的元素,如:
vector<int>::iterator mid = ivec.begin() + ivec.size() / 2;
//equals to:
vector<int>::iterator mid = (ivec.begin() + ivec.end()) / 2;

//写完这篇我就去好好复习,讲真。

Library vector Type的更多相关文章

  1. [Cpp primer] Library vector Type

    #include<vector> using std::vector; //Vector is a container. //It has a collection of same typ ...

  2. Library string Type

    The string type supports variable-length character strings.The library takes cares of managing memor ...

  3. [Cpp primer] Library string Type

    In order to use string type, we need to include the following code #include<string> using std: ...

  4. Library string type(2)——关于String的操作

    关于string的定义,请参阅博文http://blog.csdn.net/larry233/article/details/51483827 string的操作 s.empty() //Return ...

  5. qt+opencv LNK4272:library machine type 'x64' conflicts with target mathine type 'x86'

    运行时报错如上图所示,原因是你使用的opencv库是64位的,qt里面使用的编译器MSVC是32位的,解决方法如下: 将构建套件修改位64bit:

  6. C++primer学习笔记(一)——Chapter 3

    3.1 Namespace using Declarations 1.因为C++里有名字空间的定义,例如我们使用cin的时候必须写成std::cin,如果就用一次还是可以接受的,但是如果一直都这样,那 ...

  7. nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

    Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Wi ...

  8. C++学习书籍推荐《C++ Primer 第五版 (英文)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <C++ Primer(英文版)(第5版)>是全球最畅销的C++图书.这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程 ...

  9. DLL中传递STL参数,vector对象作为dll参数传递等问题(转)

    STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下 ...

随机推荐

  1. HDU-1255 覆盖的面积 覆盖的矩形面积并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255 需要保存区间覆盖线>=2的线段的长度,根据情况来更新... //STATUS:C++_AC ...

  2. linux设备驱动----利用mdev(udev)自动创建设备文件节点

    1.mdev的使用方法和原理: mdev是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合.其具有使用简单的特点.它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程 ...

  3. 新年Uber司机端换新装啦!

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  4. system partition table

    转载内容 摘录部分我的笔记的中doc,和大家一起感受Oracle 11g在分区方面的增强--System Partitioning 系统分区的特点 ●系统分区与其他分区相比,一个最根本的区别就是不需要 ...

  5. hdoj 1242 Rescue

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  6. JDBC与SQL SERVER各个版本的连接方法

    转至:blog.csdn.net/ying5420/article/details/4488246 1.SQL SERVER 2000 JDBC驱动程序:msbase.jar.mssqlserver. ...

  7. css3划过图片闪光

    css代码 01 .img { display:block; position: relative; width:800px; height:450px; margin:0 auto;} 02 .im ...

  8. 国外一些好用的UX/UI设计工具和资源分享

    国外一些好用的UX/UI设计工具和资源分享 你今天使用的设计工具也许不再适合以后的网页和APP设计项目了.新的工具不断的推出市场,目标只有一个,让你的工作更快.更容易而且工作成效更好.今天分享的这些U ...

  9. Windows平台Atom编辑器的常用快捷键小抄Cheat Sheet

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Windows平台Atom编辑器的常用快捷键小抄Cheat Sheet.

  10. ListView多选操作模式详解CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL

    这篇文章我们将详细的介绍如何实现ListView的多选操作,文中将会纠正在使用ListViewCHOICE_MODE_MULTIPLE或者CHOICE_MODE_MULTIPLE_MODAL时容易犯的 ...