您的位置:首页 > 编程语言 > C语言/C++

C++中vector简介

2016-11-01 10:51 92 查看

一、vector

1. vector(向量):C++中的一种数据结构,确切的说是一个类模板。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。例如:vector<int>和vector<string>都是数据类型。

2. 声明一个Int向量以替代一维数组:vector<int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)

3. 内存管理与效率

3.1 使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。

关于STL容器,最令人称赞的特性之一就是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据,vector在重新分配时一般把容量翻倍。当进行insert或push_back等增加元素的操作时,如果此时动态数组的内存不够用,就要动态的重新分配当前的大小的1.5~2倍的新内存区,再把原数组的内容复制进去。所以,在一般情况下,其访问速度同一般数组,只有在重新分配发生时,其性能才会下降。对于vector容器来说,如果有大量的数据需要进行push_back,应当使用reserve()函数提前设定其容量大小,否则会出现许多次容量扩充操作,导致效率低下。

3.2 STL(standard template library,标准模板库)容器

参考:http://blog.csdn.net/hackbuteer1/article/details/6791260

C++标准库中的顺序容器及相应的容器适配器,这些内容主要涉及顺序容器类型:vector、list、deque,顺序容器适配器类型:stack、queue、priority_queue。

备注:

1.C++中有些函数可以声明为内联(inline)函数,编译器遇到内联函数时就会直接扩展相应代码,而不是进行实际的函数调用。像size()这样的小库函数几乎都定义为内联函数,所以每次循环过程中调用它的运行时代价是比较小的。

2.C++程序员习惯于优先选用!=而不是<来编写循环判断条件。

3.“缓冲区溢出”错误就是对不存在的元素进行下标操作的结果。

4.vector的下标操作不添加元素,只读取或改变已存在元素。

二、iterator迭代器

1.每种容器类型都定义了自己的迭代器类型。iterator类型如:vector <int>

2.begin和end操作,用于返回迭代器。begin指向iter[0];而end指向vector的末端的下一个而非末端。通常称为“超出末端迭代器”。

3.const_iterator迭代器,该类型只用于读取容器内元素的值,但不能改变其值。

备注:

1. *为解引用操作。

2. const_iterator与const iterator区别。

例:

#include <iostream>
#include <vector>
#include <iterator>
#define max_size 100
using namespace std;

void main()
{
vector <int> text;
text.reserve(max_size);
for(int i=0;i!=10;i++){
text.push_back(i);
}
vector <int>::iterator iter;
for(iter = text.begin();iter!=text.end();++iter){
cout<<*iter<<endl;//使用*iter来访问迭代器所指向的元素
}

const vector<int> nines(10,9);//cannot change elements in nines
const vector<int>::iterator cit2 = nines.begin();//error:cit2 could change the element it refers to and nines is const
vector<int>::const_iterator it = nines.begin();//ok,it can't change an element value,so it can be used with a const vector<int>
*it = 10;//error:*it is const
++it;//ok,it is't const so we can change its value
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: