实战c++中的vector系列--将迭代器转换为索引
stl的迭代器非常方便 用于各种算法。
可是一想到vector。我们总是把他当做数组,总喜欢使用下标索引,而不是迭代器。
这里有个问题就是怎样把迭代器转换为索引:
#include <vector>
typedef std::vector<char *> MYARRAY;
// This does the trick
inline const int iterator_to_index(MYARRAY &a, MYARRAY::iterator it)
{
    return it - a.begin();
}
// Example use
main()
{
    MYARRAY     a;
    int     index;
    a.push_back("one");
    a.push_back("two");
    a.push_back("three");
    for (MYARRAY::iterator it = a.begin(); it != a.end(); it++)
    {
        index = iterator_to_index(a, it);
        printf("index=%d\n", index);
    }
}一、数组习惯使用方法
对于内置数组我们能够显式地把数组的元素初始化为一组常量值,比如 :  
int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };
我们不能用相同的方法显式地初始化 vector ,可是能够将 vector 初始化为一个已有数组的所有或一部分,仅仅需指定希望被用来初始化 vector 的数组的開始地址以及数组最末元的下一位置来实现,比如: 
// 把 ia 的 6 个元素复制到 ivec 中  
vector< int > ivec( ia, ia+6 );
被传递给ivec 的两个指针标记了用来初始化对象的值的范围, 第二个指针总是指向要拷贝的末元素的下一位置 ,标记出来的元素范围也能够是数组的一个子集,比如 :
// 拷贝 3 个元素 ia[2], ia[3], ia[4]  
vector< int > ivec( &ia[ 2 ], &ia[ 5 ] );
与内置数组不同 vector 能够被还有一个 vector 初始化 或被赋给还有一个 vector
注意 以下的定义
vector< int > ivec;
ivec[ 0 ] = 1024; //错误就是错误的 ,由于 ivec 还没有第一个元素 ,我们仅仅能索引 vector 中已经存在的元素 size()操作返回 vector 包括的元素的个数 。
以下的错误并不少见:
const int size = 7;
int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 };
vector< int > ivec( size ); 
for ( int ix = 0; ix < size; ++ix )
      ivec.push_back( ia[ ix ]); 程序结束时ivec 包括 14 个元素, ia 的元素从第八个元素開始插入。
实战c++中的vector系列--将迭代器转换为索引的更多相关文章
- 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)
		之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中.vector A中的结果我们可想而知,可是vector B中的元素还会怎样? 看看之前写过的程序: ... 
- 实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中推断不等于end())、operator[])
		遍历一个vector容器有非常多种方法.使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << ... 
- 实战c++中的vector系列--vector应用之STL的find、find_if、find_end、find_first_of、find_if_not(C++11)
		使用vector容器,即避免不了进行查找,所以今天就罗列一些stl的find算法应用于vector中. find() Returns an iterator to the first element ... 
- 实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)
		stl算法中有个copy函数.我们能够轻松的写出这种代码: #include <iostream> #include <algorithm> #include <vect ... 
- 实战c++中的vector系列--构造、operator=和assign差别
		vector或许是实际过程中使用最多的stl容器.看似简单,事实上有非常多技巧和陷阱. 着重看一看vector的构造,临时依照C++11: default (1) explicit vector (c ... 
- 实战c++中的vector系列--知道emplace_back为何优于push_back吗?
		上一篇博客说道vector中放入struct.我们先构造一个struct对象.再push_back. 那段代码中,之所以不能使用emplace_back,就是由于我们定义的struct没有显示的构造函 ... 
- 实战c++中的vector系列--emplace_back造成的引用失效
		上篇将了对于struct或是class为何emplace_back要优越于push_back,可是另一些细节没有提及.今天就谈一谈emplace_back造成的引用失效. 直接撸代码了: #inclu ... 
- 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
		关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为 ... 
- 实战c++中的vector系列--vector<unique_ptr<>>初始化(全部权转移)
		C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> ... 
随机推荐
- MyBatis入门实例-包括实体类与数据库字段对应&CLOB字段处理
			1.我的开发环境是 jdk1.7+ecplise+oracle 11g 用到的jar包:mybatis-3.1.1.jar ojdbc6.jar 2.项目整体结构 3.首先配置conf.xml ... 
- socket缓冲区以及阻塞模式
			socket缓冲区 每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区. write()/send() 并不立即向网络中传输数据,而是先将数据写入缓冲区中,再由TCP协议将数据从 ... 
- datagrid在MVC中的运用10-勾选
			本文体验与勾选有关的特性. 需要加载的books.json 展开{ "total": 4, "rows": [ { "productid": ... 
- 【微信小程序】在微信开发工具上七牛云的图片可以看到,但是在真机上看不到的原因解决
			在开发微信小程序过程中,在微信开发者工具上,七牛云的图片都可以展示出来,但是在真机上,七牛云的图片却展示不出来,也没有报404找不到或者不能加载图片的问题, 必须保证: 1.图片是用image加载的: ... 
- Spring3.1.2与Hibernate4.1.8整合
			整合Spring3.1.2 与 Hibernate 4.1.8 首先准备整合jar: Spring3.1.2: org.springframework.aop-3.1.2.RELEASE.jar or ... 
- CAShapeLayer的path动画
			CAShapeLayer的path动画 效果 源码 https://github.com/YouXianMing/Animations // // CAShapeLayerPathController ... 
- [翻译] EnterTheMatrix
			Enter The Matrix https://github.com/mpospese/EnterTheMatrix The sample application to accompany my c ... 
- css3 3d展示中rotate()介绍与简单实现
			最近在了解css3的3d动画效果,学习发现,css3中的3d效果实现还是很好玩的,现在我给你大家简单的介绍一下css3中3d效果的实现. 我也只是一个初学者,如果在博客中写的不对的地方欢迎指正. 好了 ... 
- 【12c】root container 和 pdb  的一些差别
			 Where\what ? root pdb 备注 Control files and redo log files Y belongs to the CDB and not to a spec ... 
- go语言基础之append扩容特点
			1.append扩容特点 示例: package main //必须有个main包 import "fmt" func main() { //如果超过原来的容量,通常以2倍容量扩容 ... 
