先看一下代码:

#include <iostream>
#include <vector> int main()
{
std::vector<double> doubleVector;
for(size_t i = ;true;++i)
{
double temp;
std::cin >> temp;
if(temp == -)
{
break;
}
doubleVector.push_back(temp);
} for(std::vector<double>::iterator iter = std::begin(doubleVector);
iter != std::end(doubleVector);++iter)
{
std::cout << *iter << " ";
} return ;
}
std::vector<double>::iterator iter = std::begin(doubleVector)

每一个容器都定义了一个名为 iterator 的类型,来表示这个容器的迭代器,其中std::begin()返回的是容器中第一个元素的迭代器

iter != std::end(doubleVector)

这条语句是检查是否超过了这个容器的尾部序列(也就是检查是否越界);

++iter

我们要养成一个好习惯,那就是采用前置递增,而不是后置递增,因为前置递增返回的是iter的引用,而后置递增iter++,返回的是一个新的迭代器对象,这个效率会低下;

但是我们也可以这样简化代码的书写

#include <iostream>
#include <vector> int main()
{
std::vector<double> doubleVector;
for(size_t i = ;true;++i)
{
double temp;
std::cin >> temp;
if(temp == -)
{
break;
}
doubleVector.push_back(temp);
} for(auto iter = std::begin(doubleVector);iter != std::end(doubleVector);++iter)
{
std::cout << *iter << " ";
} return ;
}

编译器会根据右侧内容来推测iter的类型;

访问对象元素的字段:

#include <iostream>
#include <vector> int main()
{
std::vector<std::string> stringVector(,"Hello ");
for(auto iter = std::begin(stringVector);iter != std::end(stringVector);++iter)
{
iter->append("world ");
}
for(auto iter = std::begin(stringVector);iter != std::end(stringVector);++iter)
{
std::cout << *iter << std::endl;
} return ;
}

还可以这样:

#include <iostream>
#include <vector> int main()
{
std::vector<std::string> stringVector(,"Hello ");
for(auto & iter : stringVector)
{
iter.append("world ");
}
for(auto & iter : stringVector)
{
std::cout << iter << std::endl;
} return ;
}

两则是相同的!

const_iterator

普通的iterator支持读和写,但是当对const对象调用std::begin()和std::end()的话,将会得到const_iterator,所以const_iterator只支持读操作,不支持写操作;

interator可以转化为const_iterator但是,const_iterator不会转化为iterator。

#include <iostream>
#include <vector> int main()
{
const std::vector<double> myVector({21l,,21.3,34.2}); for(std::vector<double>::const_iterator iter = std::begin(myVector);
iter != std::end(myVector);++iter)
{
std::cout << *iter << " ";
}
return ;
}

其中可以将std::begin()和std::end()换成std::cbegin()和std::cend();  这里的c是const的意思;注意:这种操作只能在C++14上实践

常用的函数:

1. pop_back();删除最后的元素;

2.insert(),有三种类型参数;

  第一种:insert(const_itertor pos,const T& x);

  第二种:insert(const_iterator pos,size_type n ,const T& x);在pos位置插上n个x;

  第三种:insert(const_iterator pos,inputfirstPos first, inputlastPos last);将范围first和last内的元素插入到pos

3.eras()函数的两种形式:

  eras(const_itertor pos);

  eras(const_itertor pos , const_itertor lastPos);    //删除一个范围

4.clear()  清除所有的数据

  

#include <iostream>
#include <vector> template<typename T>
void printVector(std::vector<T> &tVector)
{
for(auto &iter : tVector)
{
std::cout << iter << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<int> oneVector({,,,,});
std::vector<int> twoVector;
for(size_t i = ;i < ;++i)
{
twoVector.push_back(i+);
} std::cout << "oneVector :";
printVector(oneVector);
std::cout << "twoVector :";
printVector(twoVector); oneVector.insert(std::end(oneVector),std::begin(twoVector),std::end(twoVector));
std::cout << "oneVector :";
printVector(oneVector); int tenp = ;
std::cin >> tenp;
oneVector.insert(std::end(oneVector),tenp);
std::cout << "oneVector :";
printVector(oneVector); oneVector.erase(std::end(oneVector) - ); //注意这里要+1
std::cout << "oneVector :";
printVector(oneVector); twoVector.pop_back();
std::cout << "twoVector :";
printVector(twoVector); oneVector.clear(); // 清除所有数据
std::cout << "oneVector :";
printVector(oneVector); return ;
}

结果是:

oneVector :1 2 3 4 5
twoVector :6 7 8 9 10
oneVector :1 2 3 4 5 6 7 8 9 10
11
11
oneVector :1 2 3 4 5 6 7 8 9 10 11
oneVector :1 2 3 4 5 6 7 8 9 10
twoVector :6 7 8 9
oneVector :

vector详讲(二)迭代器的更多相关文章

  1. map详讲<二>

    查找元素: Map可以根据健来查找元素,提供方法find(key),如果是这个健对应的元素存在,则返回的是这个健的迭代器iterator,否则返回的是std::end(): 使用find()函数有点笨 ...

  2. vector详讲(三)实例

    移动语义: push语句有时候会通过移动语义来提高性能 #include <iostream> #include <vector> class Element { public ...

  3. vector详讲(一)

    <vector>头文件里带有两个类型参数的类模板,第一个参数是需要指定的数据类型,第二个是分配器(allocator)类型 template<class T, class Alloc ...

  4. C++ STL之vector详解

    转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors   vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作 ...

  5. stl——vector详解

    stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...

  6. zTree应用实例详讲(3)

    zTree应用实例详讲(3) 上一讲中,已经讲到了重命名与删除.那么这一讲,我们来做新建文件夹. 其实新建是非常简单的,想一下我们想要的效果:点击新建,然后在一个节点下面出现一个新建的文件夹,并且与此 ...

  7. zTree应用实例详讲

    zTree应用实例详讲(1) 因为项目的需要,要创建一棵动态的文件树,此树除了实现异步获取子节点外,还要实现对树节点的增.删.改.查.移动.重命名.批量删除.批量移动. 每一个操作都要和数据库打交道. ...

  8. SQL优化 MySQL版 - 多表优化及细节详讲

    多表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...

  9. PopUpWindow使用详解(二)——进阶及答疑

      相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...

随机推荐

  1. 二、hdfs单节点安装

    一.准备环境 在配置hdfs之前,我们需要先安装好hadoop的配置,本文主要讲述hdfs单节点的安装配置. hadoop的单节点安装配置请参考:https://www.cnblogs.com/lay ...

  2. SSM框架文件远程服务器下载

    1.首先你必须要建立连接 获取URL的输入流 2.之后就是文件读取和写入了 3.还有就是设置响应头,响应码等 代码 @RequestMapping("/fileDownLoad") ...

  3. groovy闭包科里化参数

    科里化闭包:带有预先绑定形参的闭包.在预先绑定一个形参之后,调用闭包时就不必为这个形参提供实参了.有助于去掉方法调用中的冗余重复. 使用curry方法科里化任意多个参数 使用rcurry方法科里化后面 ...

  4. java设计模式-----7、装饰模式

    首先,什么是装饰者模式呢??? 装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.他是23种设计模式之一,英文叫Decorator ...

  5. js 控制选中文字

     //脚本获取网页中选中文字 var word = document.selection.createRange().text;  //获取选中文字所在的句子 var range =  documen ...

  6. sdoi 2017 r1游记

    第一次参加省选... 不过幸亏我参加过WC和THUWC,还是有些经验的. 经验就是:多拿部分分(不过话说我的部分分大部分都丢了). D1: 第一题没有预处理斐波那契数列的幂,算复杂度算错了...丢了4 ...

  7. php备注

    一.关于OOP 1.PHP目前不支持方法重载

  8. Django——REST framework

    1. 什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审 ...

  9. Class.forName和ClassLoader.loadClass的区别(转载)

    Class的装载分了三个阶段,loading,linking和initializing,分别定义在The Java Language Specification的12.2,12.3和12.4.Clas ...

  10. GoJs实现流程管理图

    GoJS是一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库. 可以加入诸多功能.如流程判断,节点处理等等.GOJS在设计上极大的减轻了开发人员的开发成本.