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系列--将迭代器转换为索引的更多相关文章

  1. 实战c++中的vector系列--再谈vector的insert()方法(都是make_move_iterator惹的祸)

    之前说过了关于vector的insert()方法,把vector B的元素插入到vector A中.vector A中的结果我们可想而知,可是vector B中的元素还会怎样? 看看之前写过的程序: ...

  2. 实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中推断不等于end())、operator[])

    遍历一个vector容器有非常多种方法.使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << ...

  3. 实战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 ...

  4. 实战c++中的vector系列--copy set to vector(别混淆了reserve和resize)

    stl算法中有个copy函数.我们能够轻松的写出这种代码: #include <iostream> #include <algorithm> #include <vect ...

  5. 实战c++中的vector系列--构造、operator=和assign差别

    vector或许是实际过程中使用最多的stl容器.看似简单,事实上有非常多技巧和陷阱. 着重看一看vector的构造,临时依照C++11: default (1) explicit vector (c ...

  6. 实战c++中的vector系列--知道emplace_back为何优于push_back吗?

    上一篇博客说道vector中放入struct.我们先构造一个struct对象.再push_back. 那段代码中,之所以不能使用emplace_back,就是由于我们定义的struct没有显示的构造函 ...

  7. 实战c++中的vector系列--emplace_back造成的引用失效

    上篇将了对于struct或是class为何emplace_back要优越于push_back,可是另一些细节没有提及.今天就谈一谈emplace_back造成的引用失效. 直接撸代码了: #inclu ...

  8. 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())

    关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为 ...

  9. 实战c++中的vector系列--vector&lt;unique_ptr&lt;&gt;&gt;初始化(全部权转移)

    C++11为我们提供了智能指针,给我们带来了非常多便利的地方. 那么假设把unique_ptr作为vector容器的元素呢? 形式如出一辙:vector<unique_ptr<int> ...

随机推荐

  1. 不用windows不会死

    不用windows不会死 近期看到win8广告,仅仅要2999元. 事实上他们不知道,不用windows不但不会死,还会活得更好. 不信.你去问问那些非windows用户,他们是不是非常快乐?烦恼非常 ...

  2. ARC 特性

    ResultVC *myResultVC = [[ResultVC alloc]initWithNibName:@"ResultVC" bundle:nil]; [self.vie ...

  3. js获取本机mac地址,IP地址,计算机名

    <!DOCTYPE HTML> <html> <head> <title>js获取本机mac地址,IP地址,计算机名</title> < ...

  4. tomcat配置301重定向

    tomcat默认情况下不带www的域名是不会跳转到带www的域名的,而且也无法像apache那样通过配置.htaccess来实现.如果想要把不带“www'的域名重定向到带”www"域名下,又 ...

  5. 2008技术内幕:T-SQL语言基础 单表查询摘记

    这里的摘抄来自<Microsoft SQL Server 2008技术内幕:T-SQL语言基础>,书中用到的案例数据库是这个 TSQLFundamentals2008 ,官网给出的连接是这 ...

  6. Latex初学者入门(三)-- 用BibTeX生成参考文献

    昨boss要往期Elsevier 刊投文章,距上次排版貌似过了好久,生疏了不少,翻出以前的写的一些笔记再复习复习. 不过这次好多了,仅仅是改个格式,原始的文章已经用latex编写过了(个人感觉最头疼的 ...

  7. Windows + IIS 环境部署Asp.Net Core App

    环境:Windows Server 2012, IIS 8, Asp.Net Core 1.1. 不少人第一次在IIS中部署Asp.Net Core App的人都会遇到问题,会发现原来的部署方式无法运 ...

  8. how to configure logback for Mybatis to print my SQL

    To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...

  9. C语言:字符串读取流读取文件中的数据

    #include<stdio.h> int main() { //定义文件指针 FILE *f = NULL; //打开文件 f = fopen("1.txt",&qu ...

  10. crtmpserver实现防盗流和流推送验证 之二

    IV. Catching the thieves 抓住小偷 Well, we have just added a secure mechanism to our little streaming se ...