vector的初始化和遍历
2012-04-07 19:26
330 查看
这里只说明常用的vector初始化的方式。一般vector的初始化我还是比较习惯于像数组一样的初始化方式。一个一个赋值,或者用花括号的初始化。下面用一个程序来说明:
vector的遍历:
一般数组的遍历方式应该都知道怎么遍历。上面用了迭代器进行遍历,一般在STL中很常见,但是在vector中一样可以像在数组中用for循环进行遍历,由于在像链表,队列,栈这样的容器中没有办法用像遍历数组一样遍历,只能用迭代器,所以对于STL中通用用迭代器进行遍历。
但是还有一种简便的方式。
这种方式的遍历引用另一篇文章:
对STL的容器中,遍历是一个非常经常采用的动作,为此STL也提供一个算法,for_each
遍历一个容器,我们第一个想到的是
for (int i = 0;i < a.size();++i)
的循环来实现。
这样做有几个弊端,比如我现在很多地方用vector作为传引用参数进行传递,为了减少对象构造和析构的代价,我一般采用指针来传递,那么我就要在程序很多地方 写上类似下面的代码
for (int i=0;i < a.size();++i)
delete a[i];
虽然代码很多都一样,可是到处泛滥着这种循环语句,让人阅读程序容易和其它释放指针行为产生混淆
好处有几个:
1:for_each调用容器内部的遍历函数,比我们的++的方式遍历,效率不会低是肯定的
2:delete指针时候,可以再次确认指针类型
3:用仿函数类,编译器在编译期对函数进行展开,实际上没有函数调用的发生
4:加强代码自说明能力,减少循环,提高代码可读性
文章来自
#include "stdafx.h" #include <vector> #include <iostream.h> using namespace std; int main(int argc, char* argv[]) { int a[7]={1,2,3,4,5,6,7}; vector<int> ivector(a,a+7);//vector的赋值并不可以像数组一样方便的用花括号方便的完成赋值,这里借用了数组来初始化这个vector,初始化方 //式vector<elementType> intvec(begin,end);这样可以用起来看上去还是比较习惯的。 vector<int>::iterator iter; for (iter=ivector.begin();iter!=ivector.end();iter++) { cout<<*iter<<'\0'; } cout<<endl; ivector[5]=1;//单个vector的赋值,这个方式看上去还是和数组一样的,不过你也可以这么写ivector.at(5)=1;但是就是不习惯 cout<<ivector[5]<<endl<<ivector.size()<<endl; for (iter=ivector.begin();iter!=ivector.end();iter++) { cout<<*iter<<'\0'; } return 0; }
vector的遍历:
一般数组的遍历方式应该都知道怎么遍历。上面用了迭代器进行遍历,一般在STL中很常见,但是在vector中一样可以像在数组中用for循环进行遍历,由于在像链表,队列,栈这样的容器中没有办法用像遍历数组一样遍历,只能用迭代器,所以对于STL中通用用迭代器进行遍历。
但是还有一种简便的方式。
#include "stdafx.h" #include <vector> #include <algorithm> #include <iostream> using namespace std; void print(int n) { cout<<n<<'\0'; } int main(int argc, char* argv[]) { int a[7]={1,2,3,4,5,6,7}; vector<int> ivector(a,a+7); vector<int>::iterator iter; for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历 cout<<endl; ivector[5]=1; cout<<ivector[5]<<endl<<ivector.size()<<endl; for_each(ivector.begin(),ivector.end(),print);//用for_each进行遍历 return 0; }
这种方式的遍历引用另一篇文章:
对STL的容器中,遍历是一个非常经常采用的动作,为此STL也提供一个算法,for_each
遍历一个容器,我们第一个想到的是
for (int i = 0;i < a.size();++i)
的循环来实现。
这样做有几个弊端,比如我现在很多地方用vector作为传引用参数进行传递,为了减少对象构造和析构的代价,我一般采用指针来传递,那么我就要在程序很多地方 写上类似下面的代码
for (int i=0;i < a.size();++i)
delete a[i];
虽然代码很多都一样,可是到处泛滥着这种循环语句,让人阅读程序容易和其它释放指针行为产生混淆
好处有几个:
1:for_each调用容器内部的遍历函数,比我们的++的方式遍历,效率不会低是肯定的
2:delete指针时候,可以再次确认指针类型
3:用仿函数类,编译器在编译期对函数进行展开,实际上没有函数调用的发生
4:加强代码自说明能力,减少循环,提高代码可读性
文章来自
相关文章推荐
- vector的几种初始化和遍历
- 二维数组,二维vector的声明初始化,&传递(iter,模板,C99特性),iterator遍历
- Vector的初始化与遍历
- C++标准库(STL)之vector容器的使用(包括特点、初始化、遍历与常用操作)
- vector 初始化 与遍历
- vector的初始化和遍历
- Vector的初始化与遍历
- C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
- Vector的初始化与遍历 - dtor - 博客园
- C++ 有关STL中容器vector的操作 初始化 遍历 删除
- vector的初始化和遍历
- vector的初始化和遍历
- vector遍历和初始化
- vector的几种初始化和遍历
- vector的几种初始化和遍历
- 【c++系列】vector初始化和遍历
- STL的vector<string>的三种简单初始化方式
- 如何线程安全地遍历List:Vector、CopyOnWriteArrayList
- C++ Primer 9.35——循环遍历vector容器删除指定元素的标准写法
- 初始化执行 这里把所有的接口都遍历一遍 存到权限表里面