vector详讲(二)迭代器
先看一下代码:
#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详讲(二)迭代器的更多相关文章
- map详讲<二>
查找元素: Map可以根据健来查找元素,提供方法find(key),如果是这个健对应的元素存在,则返回的是这个健的迭代器iterator,否则返回的是std::end(): 使用find()函数有点笨 ...
- vector详讲(三)实例
移动语义: push语句有时候会通过移动语义来提高性能 #include <iostream> #include <vector> class Element { public ...
- vector详讲(一)
<vector>头文件里带有两个类型参数的类模板,第一个参数是需要指定的数据类型,第二个是分配器(allocator)类型 template<class T, class Alloc ...
- C++ STL之vector详解
转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作 ...
- stl——vector详解
stl——vector详解 stl——vector是应用最广泛的一种容器,类似于array,都将数据存储于连续空间中,支持随机访问.相对于array,vector对空间应用十分方便.高效,迭代器使ve ...
- zTree应用实例详讲(3)
zTree应用实例详讲(3) 上一讲中,已经讲到了重命名与删除.那么这一讲,我们来做新建文件夹. 其实新建是非常简单的,想一下我们想要的效果:点击新建,然后在一个节点下面出现一个新建的文件夹,并且与此 ...
- zTree应用实例详讲
zTree应用实例详讲(1) 因为项目的需要,要创建一棵动态的文件树,此树除了实现异步获取子节点外,还要实现对树节点的增.删.改.查.移动.重命名.批量删除.批量移动. 每一个操作都要和数据库打交道. ...
- SQL优化 MySQL版 - 多表优化及细节详讲
多表优化及细节详讲 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:本文章需要MySQL数据库优化基础或观看前几篇文章,传送门: B树索引详讲(初识SQL优化,认识索引):htt ...
- PopUpWindow使用详解(二)——进阶及答疑
相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow ...
随机推荐
- MySQL数据库的备份与恢复命令
1.数据库导出SQL脚本 启动MySQL服务器 输入:mysqldump -u root -p 数据库名>生成脚本文件路径 输入登录密码,回车键 例如: $ mysql.server star ...
- HTML5拖拽/拖放(drag & drop)详解
H5中拖拽属性: draggable: auto | true | false 拖动事件: - dragstart 在元素开始被拖动时触发 - dragend 在拖动操作完成时触发 - dra ...
- BZOJ1014 [JSOI2008]火星人
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam, 我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 ...
- Two references point to the same heap memory
Phone类 package com.itheima_03; /* * 手机类 */ public class Phone { String brand; int price; String colo ...
- c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别
很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...
- 没有对比就没有伤害,memcache and redis
Memcached 与 Redis 的关键性能指标比较 性能对比: Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis在存储小数据时比 Memcached 性 ...
- 使用公钥和私钥实现LINUX下免密登录
linux公钥私钥实现无密码登录 首先本地主机生成公约和私钥 # ssh-keygen /生成公钥和私钥 不要更改默认路径,中途不要输入密码,直接两次回车. 2. 将生成 ...
- kettle 创建任务定时执行数据抽取
定时执行脚本 使用SPOON 工具建立好转换文件 .ktr,创建下面的.BAT文件,用操作系统的任务调用批处理. G:\soft\data-integration\pan.bat /norep -fi ...
- Zip压缩/解压缩(文件夹)
#PS2.0压缩为.zip文件: $zip = "D:\audit_log\test.zip"New-Item $zip -ItemType file$shellApplicati ...
- vs安装部署“必备”组件里面正常情况没有出现office2010 PIA组件
vs安装部署“必备”组件里面正常情况没有出现office2010 pia组件时,将 Office2010PIARedist 文件夹放在C:\Program Files\Microsoft SDKs\W ...