通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  中士

注册:2009-4-23
跳转到指定楼层
1#
发表于 2009-10-19 12:14:42 |只看该作者 |倒序浏览
题外话:本打算整一篇介绍STL内部的一些机制和原理的,可惜写到半路发现自己水平不够,估计要等到我看完<STL源码剖析>后才可以吧,看来以后这STL读书笔记还是朝着如何使用的方向吧.
//
介绍:
vector容器作为数组的一个泛化推广,不仅可以进行数组一样的元素随机访问,还可以在容器尾端插入新元素.vector具有自动的内存管理功能,对于元素的插入和删除,可以动态调整所占用的内存空间.
//
使用:
使用vexctor容器必须包含”vector”头文件,然后创建一个vector容器对象(方式很多种,这里就不一一介绍了,具体看实例 :D),然后我们对vector容器初始化赋值(可以使用push_back在容器尾端加入元素),如果我们要对vector容器遍历的话,可以常用数组或者迭代器的方式.
下面的例子展示了如何用数组方式访问vector元素.
#include <vector>
#include <iostream>
using namespace std;
int main(void){
      vector<int> v;
      v.push_back(11);
      v.push_back(22);   
      v.push_back(33);
      for(int i = 0; i < v.size(); i++)
          cout << "v[" << i << "] = " << v << endl;
      return 0;
}
运行结果:
v[0] = 11
v[1] = 22
v[2] = 33
//
如果要使用迭代器的方式访问的话就要使用vector容器提供的iterator类型,定义一个迭代器变量,然后对迭代器进行自增”++”,或者自减”--”之类的操作就可以将迭代器从一个元素位置移动到另一个元素位置,然后再通过取值”*”操作,就可以得到迭代器指向的元素.
vector容器还提供了begin()和end()函数,用于获取首元素的迭代器和最后一个元素的下一位置的迭代器(标注1).
下面的代码就展示了如何用迭代器访问vector:

#include <vector>
#include <iostream>
using namespace std;
int main(void){
      vector<int> v;
      v.push_back(11);
      v.push_back(22);
      v.push_back(33);
      vector<int>::iterator i;
      int j;
      for(i=v.begin(),j=0; i!=v.end(); i++,j++)     
          cout<<"v[" << j << "] = " << *i<< endl;
      return 0;
}
运行结果: (同上)
//
除了了push_back函数,可以给vector容器添加元素以外,insert函数则可以在任意位置插入元素.由于插入时候要先将插入位置后面的元素后移,因此insert函数耗时比push_back函数久.
下面代码就展示了如何使用insert函数:
#include <vector>
#include <iostream>
using namespace std;
int main(void){
      vector<int> v;
      v.push_back(22);   
      v.push_back(33);
      v.push_back(55);
      v.push_back(66);
      v.insert(v.begin() + 3, 44);  
      v.insert(v.begin(), 11);     
      v.insert(v.end(), 77);      
      for(int i = 0; i < v.size(); i++)     
          cout << "v[" << i << "] = " << v << endl;
      return 0;
}
运行结果: (类似于上)
//
学会了如何给vector容器添加元素以后,当然要知道怎么删除元素了.vector容器提供了erase函数,可以用来删除指定元素或者迭代器区间[first,last),(标注1).
vector容器提供另一个删除元素的函数是clear函数,它在内部调用了erase函数将[begin().end())区间的元素删除.
下面代码展示了如何使用erase函数和clear函数:
#include <iostream>
#include <vector>
using namespace std;
int main(void){
      vector<int> v;
      v.push_back(11);
      v.push_back(22);
      v.push_back(33);
      v.push_back(44);
      v.push_back(55);
      v.erase(v.begin()+1);  
      v.erase(v.begin()+2,v.begin()+4);
      vector<int>::iterator i;
      int j;
      for(i=v.begin(),j=0; i!=v.end(); i++,j++)     
          cout<<"v[" << j << "] = " << *i<< endl;
      v.clear();
      cout << "vector clear()!" << endl;
      return 0;
}
运行结果:
v[0] = 11
v[1] = 33
vector clear()!
//
之前我们用的迭代器是正向,vector还提供了反向迭代器(reverse_iterator,相应的rbegin(),rend()),具体使用方法跟之前的一样,这里就不举例了.(浪费篇幅:-D)
//
如果你想交换两个vector容器元素的话,可以使用swap()函数.
下面代码展示了如何使用swap函数:
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v){
      for(int i = 0; i < v.size(); i++)
          cout << v << " ";
      cout << endl;
}
int main(void){
      vector<int> v1;  
      v1.push_back(11);
      v1.push_back(22);
      v1.push_back(33);
      cout << "v1 = ";
      print(v1);
     //
      vector<int> v2;
      v2.push_back(44);
      v2.push_back(55);
      v2.push_back(66);
      cout << "v2 = ";
      print(v2);
      //
      v1.swap(v2);
      cout << "After swap:" <<endl;
      cout << "v1 = ";
      print(v1);
      cout << "v2 = ";
      print(v2);
      return 0;
}
运行结果:
v1 = 11 22 33
v2 = 44 55 66
After swap:
v1 = 44 55 66
v2 = 11 22 33
//
vector容器还提供了一些可以用于统计的函数,可以用empty函数来判断容器是否为空,size函数来容器实际的元素个数(上面已经有用到过),max_size函数来获得容器的最大元素个数,capacity函数来获得容器当前可容纳的vector元素个数(如果没有特殊声明容器可容纳元素个数的话,该函数返回值一般跟size是一样的,不过如果使用reserve函数来重新调整容器可容纳元素个数则会修改该函数的返回值,而不会修改size函数的返回值),
下面的代码展示了上面几个函数的用法:
#include <vector>
#include <iostream>
using namespace std;
void print(vector<int>& v){
      cout << "---------------------" << endl;
      cout << "empty = " << v.empty() << endl;
      cout << "size = " << v.size() << endl;
      cout << "capacity = " << v.capacity() << endl;
}
int main(void){  
      using namespace std;
      vector<int> v;
      cout << "max_size = " << v.max_size() << endl;
      print(v);
      v.push_back(11);
      v.push_back(22);
      print(v);
      v.push_back(33);
      v.push_back(44);
      print(v);
      v.reserve(30);
      print(v);
      return 0;
}
运行结果: (篇幅有限,故略之)
//
上次介绍了vector容器的几个常用的函数,当然该容器还有很多函数只是这里不详细介绍了,下面简单说一下:
front函数可以返回容器首元素的引用.(容器不能为空)
back函数相应的返回末元素的引用(容器不能为空)
pop_back函数痛push_back相反.用于删除容器末尾元素.
标注1:
这里为什么是最后一个元素的下一位置呢?因为我已经打算不讲述STL内部的机制和原理,所以这里就简单说一下.在C++STL里面大部分都是使用半闭区间,即[first,last),所以不会对last进行处理.
已有 1 人评分经验 家园分 收起 理由
1997deman + 5 + 10 + 5 奖励

总评分: 经验 + 5  家园分 + 10  + 5   查看全部评分

举报本楼

您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-11-16 02:24 , Processed in 0.367115 second(s), 16 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部