先看一下代码:

#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. MySQL数据库的备份与恢复命令

    1.数据库导出SQL脚本 启动MySQL服务器 输入:mysqldump -u root -p  数据库名>生成脚本文件路径 输入登录密码,回车键 例如: $ mysql.server star ...

  2. HTML5拖拽/拖放(drag & drop)详解

    H5中拖拽属性: draggable: auto | true | false   拖动事件:   - dragstart 在元素开始被拖动时触发 - dragend 在拖动操作完成时触发 - dra ...

  3. BZOJ1014 [JSOI2008]火星人

    Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...

  4. Two references point to the same heap memory

    Phone类 package com.itheima_03; /* * 手机类 */ public class Phone { String brand; int price; String colo ...

  5. c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别

    很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...

  6. 没有对比就没有伤害,memcache and redis

    Memcached 与 Redis 的关键性能指标比较 性能对比: Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis在存储小数据时比 Memcached 性 ...

  7. 使用公钥和私钥实现LINUX下免密登录

    linux公钥私钥实现无密码登录 首先本地主机生成公约和私钥 # ssh-keygen               /生成公钥和私钥 不要更改默认路径,中途不要输入密码,直接两次回车. 2.  将生成 ...

  8. kettle 创建任务定时执行数据抽取

    定时执行脚本 使用SPOON 工具建立好转换文件 .ktr,创建下面的.BAT文件,用操作系统的任务调用批处理. G:\soft\data-integration\pan.bat /norep -fi ...

  9. Zip压缩/解压缩(文件夹)

    #PS2.0压缩为.zip文件: $zip = "D:\audit_log\test.zip"New-Item $zip -ItemType file$shellApplicati ...

  10. vs安装部署“必备”组件里面正常情况没有出现office2010 PIA组件

    vs安装部署“必备”组件里面正常情况没有出现office2010 pia组件时,将 Office2010PIARedist 文件夹放在C:\Program Files\Microsoft SDKs\W ...