先看一下代码:

#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. 06-码蚁JavaWeb之Servlet生命周期与基本配置

    学习地址:[撩课-JavaWeb系列1之基础语法-前端基础][撩课-JavaWeb系列2之XML][撩课-JavaWeb系列3之MySQL][撩课-JavaWeb系列4之JDBC][撩课-JavaWe ...

  2. CodeForces 604A(浮点数)

    这道题需要注意一个点,浮点数的误差问题 判断里的0.3*a[i]换成3*a[i]/10就过了 这个后面还要专门研究一下 #include <iostream> #include <s ...

  3. HDU3629:Convex

    传送门 求凸四边形的个数 转化成总数减去凹四边形的个数 凹四边形一定是一个三角形中间包含的另外一个点 那么枚举被包含的点,其它的对于这个点极角排序 被包含不好算,算总数减去不被包含的 枚举三角形的一个 ...

  4. 关于<!DOCTYPE html>

    1.定义 DOCTYPE标签是一种标准通用标记语言的文档类型声明,目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(DTD)来解析文档. <!DOCTYPE> 声明必须是 ...

  5. 【转载记录】Accessing Device Drivers from C#

    来源:http://www.drdobbs.com/cpp/accessing-device-drivers-from-c/184416423/   Device Drivers are writte ...

  6. Angular js部分关键字的理解

    模板:动态模板,是动态的,直接去处理DOM的,而不是通过处理字符串模版(静态模板) mvc:核心思想实现"数据管理-数据模型Model.应用逻辑-控制器Controller.数据表现-视图V ...

  7. android热加载随记

    在我们日常的开发过程中,程序难免会出现BUG,一般有集中处理方式,发布新版本APP让用户来升级,或者打补丁来修复bug 前者本文在这里不错讨论,打补丁升级又分为两种一种是需要重启应用,一种是不需要.不 ...

  8. 算法day02

    算法动态演示网站 数组是有长度限制的,有类型限制 CPU计算 每次是2的32位的,32根线,支持最大是4G 数组:线性表 列表:动态表链表:存储的位置不是连续的 insert 时间复杂度是 Onapp ...

  9. flask请求流程

  10. 在notepad++中快速插入当前时间方法

    插件是notepad++的一大优势,而要实现此功能,也必须借助TextFX插件. 1.点击"插件"-->"Plugin Manager"-->&qu ...