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 ...
随机推荐
- [javaSE] 多线程通信(等待-唤醒机制)
两个线程操作同一个资源,比如,输入和输出,操作同一个对象,此时两个线程会争夺cpu的执行权,随机的进行切换.我们想实现先输入再输出,顺序的执行 目标对象定义一个标记字段,进行判断,wait()和not ...
- 4、构造方法、this、super
构造方法 构造方法引入 * A:构造方法的引入 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是 ...
- java web工程web.xml介绍
转载自:http://blog.csdn.net/believejava/article/details/43229361 Web.xml详解: 1.web.xml加载过程(步骤) 首先简单讲一下,w ...
- 小工具-IP地址获取和设置及端口访问验证(windows)
技术部在业务部门眼里就是后勤部门,业务部门要搬到新大楼去 领导要求去帮忙调试业务人员的电脑,要保证这些大爷们周一上班来,就喝着茶打开新浪,然后打开OA看看. 手上就几个桌面支持的兄弟,要弄一百台多电脑 ...
- 基于 JWT-Auth 实现 API 验证
基于 JWT-Auth 实现 API 验证 如果想要了解其生成Token的算法原理,请自行查阅相关资料 需要提及的几点: 使用session存在的问题: session和cookie是为了解决http ...
- 关于电脑宽带显示连接 qq可以登录 但是无法上网的问题
---恢复内容开始--- 大家都遇到过这种情况吧,右下角显示网络已连接,但就是上不了网,解决的办法大都是什么,打开网络与共享中心设置什么协议什么的,当然,这些有可能是有用的,但是有一些不管怎么设置协议 ...
- How to save rules of the iptables?
The easy way is to use iptables-persistent. Install iptables-persistent: sudo apt-get install iptabl ...
- Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影)
Python爬虫教程-11-proxy代理IP,隐藏地址(猫眼电影) ProxyHandler处理(代理服务器),使用代理IP,是爬虫的常用手段,通常使用UserAgent 伪装浏览器爬取仍然可能被网 ...
- C#中Array、ArrayList和List三者的区别
1.Array 在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,而且赋值与修改元素也很简单. 它的空间大小是固定的,空间不够时也不能再次申请,所以需要事前确定合适的空间大小. 2. ...
- database design three form
https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html