Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147182
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 145
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-12 15:27
个人简介

文章分类

全部博文(14)

文章存档

2014年(14)

分类: C/C++

2014-05-23 16:23:54

简介
vector是C++标准模板库的一部分,它是一个多功能的能够操作多种数据结构和算法的模板类和函数库;可以理解成是一个动态数组(dynamic array),类似于c语言中的动态数组。使用中我们一般称它为容器。我们可以定义成动态的也可以初始化为固定长度。

vector的使用需要包含以下头文件:
  1. #include <vector>
vector属标准命名空间域(std),使用时需对命名空间进行限定:
  1. using std::vector;
  2. vector<int> vInts;
或者
  1. std::vector<int> vInts;
vector成员函数

函数

描述

c.assign(beg,end)

c.assign(n,elem)

将[beg; end)区间中的数据赋值给c。

将n个elem的拷贝赋值给c。

c.at(idx)

传回索引idx所指的数据,如果idx越界,抛出out_of_range。

c.back()

传回最后一个数据,不检查这个数据是否存在。

c.begin()

返回第一个元素的迭代器。

c.capacity()

返回容器中数据个数。

c.clear()

移除容器中所有数据。

c.empty()

判断容器是否为空。

c.end()

返回最后一个元素的下一个元素的迭代器。

c.erase(pos)

c.erase(beg,end)

删除pos位置的数据,传回下一个数据的位置。

删除[beg,end)区间的数据,传回下一个数据的位置。

c.front()

传回地一个数据。

get_allocator

使用构造函数返回一个拷贝。

c.insert(pos,elem)

c.insert(pos,n,elem)

c.insert(pos,beg,end)

在pos位置插入一个elem拷贝,传回新数据位置。

在pos位置插入n个elem数据。无返回值。

在pos位置插入在[beg,end)区间的数据。无返回值。

c.max_size()

返回容器中最大数据的数量。

c.pop_back()

删除最后一个数据。

c.push_back(elem)

在尾部加入一个数据。

c.rbegin()

传回一个逆向队列的第一个数据。

c.rend()

传回一个逆向队列的最后一个数据的下一个位置。

c.resize(num)

重新指定队列的长度。

c.reserve()

保留适当的容量。

c.size()

返回容器中实际数据的个数。

c1.swap(c2)

swap(c1,c2)

将c1和c2元素互换。

同上操作。

vector c

vector c1(c2)

vector c(n)

vector c(n, elem)

vector c(beg,end)

c.~ vector ()

创建一个空的vector。

复制一个vector。

创建一个vector,含有n个数据,数据均已缺省构造产生。

创建一个含有n个elem拷贝的vector。

创建一个以[beg;end)区间的vector。

销毁所有数据,释放内存。


vector另一种取元素的方法:

函数

描述

operator[]

返回容器中指定位置的一个引用。


vector可以随机进行数据的读取、修改、删除,只要我们定义一个位置。由于vector是顺序存储的,所以在结尾处插入或删除元素时,vector的效率是非常高的,但是在开始或中间插入或删除数据时,效率会大大降低,因为vector需要对后面所有位置的数据进行移动。

vector使用

1、创建(以int为例)
  1. vector<int> v1; //默认v1为空,故下面的赋值是错误的v1[0]=5;

  2. vector<int> v2(v1); 
  3. 或 v2 v1; 
  4. 或 vector<int> v2(v1.begin(), v1.end()); //v2是v1的一个副本,若v1.size()> v2.size()则赋值后v2.size()被扩充为v1.size()

  5. vector<int> v3(n,i); //v3包含n个值为i的int类型元素

  6. vector<int> v4(n); //v4含有n个值为0的元素

  7. int a[5]={0,1,2,3,3}; vector<int> v5(a,a+5); //v5的size为5,v5被初始化为a的5个值。后一个指针要指向将被拷贝的末元素的下一位置。

  8. vector<int> v6(v5);//v6是v5的拷贝
初始化规则:
    1>     如果没有指定元素初始化式,标准库自行提供一个初始化值进行值初始化。
    2>     如果保存的式含有构造函数的类类型的元素,标准库使用该类型的构造函数初始化。
    3>     如果保存的式没有构造函数的类类型的元素,标准库产生一个带初始值的对象,使用这个对象进行值初始化。

2、添加/插入数据

vector中添加数据的方法是使用push_back()成员函数,并将数据添加到vector末尾处。
  1. std::vector<int> vInts;
  2. vInts.push_back(1);
下标赋值:
  1. vector<int> A(10); // 创建一个有10个元素的容器
  2. for (int i = 0; i < 10; i++)
  3. {
  4.     A[i] = i;
  5. }

插入数据有三个函数:
  1. iterator insert( iterator loc, const TYPE &val ); 
    void insert( iterator loc, size_type num, const TYPE &val ); 
    void insert( iterator loc, input_iterator start, input_iterator end );

  2. vInts.insert(pointer,number, content); 在pointer指向的位置插入number个content的拷贝。
  3. vInts.insert(pointer, content);        在pointer指向的位置插入content的拷贝。
  4. vInts.insert(pointer,a[2],a[4]);       将a[2]到a[4]三个元素插入pointer指向的位置后面。

3、获取大小

使用vector时,我们经常根据数据库、文件等途径的具体数据进行push_back();所以我们无法确定vector的大小和是否为空,这时就需要进行检查,更为严谨的做法是使用empty()和size()两个函数,如下:
  1. int nSize = v.empty() ? -1 : static_cast<int>(v.size());
4、删除数据
   删除一个元素:
  1. iterator erase( iterator _Where);    删除_Where元素返回指向删除元素的下一个元素的迭代器(iterator)
    删除多个元素:
  1. iterator erase( iterator _First, iterator _Last);   删除_First 到 _Last 区间的元素,返回_Last元素的下一个元素迭代器(iterator)
    删除末尾元素
  1. pop_back(); 删除末尾元素,无返回值
    清空vector所有元素
  1. clear()
5、获取数据
有两种方式:
1、   iterator  vector::at()
2、   iterator  vector::operator[]

注意:operator[]方式没有进行边界检查,当获取的下标比vector长度大时不会有异常产生,而at()在超出边界时会抛出异常,所有使用at()方式获取数据是首选。

技巧及注意问题

1、使用reserve()函数提前设定容量大小,避免多次容量扩充操作导致效率低下。
2、使用“交换技巧”来修整vector过剩空间/内存
3、使用函数时注意对边界的检查,防止有些函数超出边界使用时不抛出异常。

实例

点击(此处)折叠或打开

  1. #include <vector>
  2. #include <iostream>
  3. using namespace std;

  4. int main(int argc, char* argv[])
  5. {

  6.     // 构造函数,复制构造函数(元素类型要一致),
  7.     vector<int> A; // 创建一个空的的容器
  8.     vector<int> B(10,100); // 创建一个10个元素,每个元素值为100
  9.     vector<int> C(B.begin(),B.end()); // 使用迭代器,可以取部分元素创建一个新的容器 [B.begin, B.end)
  10.     vector<int> D(C); // 复制构造函数,创建一个完全一样的容器
  11.     
  12.     // 重载 =
  13.     vector<int> E;
  14.     E = B;
  15.  
  16.     //vector::begin(),返回的是迭代器
  17.    
  18.     vector<int> F(10); // 创建一个有10个元素的容器
  19.     for (int i = 0; i < 10; i++)
  20.     {
  21.         F[i] = i;
  22.     }

  23.     /*
  24.     vector<int> F; //创建一个空容器
  25.     for (int i = 0; i < 10; i++)
  26.     {
  27.         F.push_back(i);
  28.     }
  29.     */

  30.     vector<int>::iterator BeginIter = F.begin();
  31.     cout << *BeginIter << endl; //输出0

  32.     //vector::end() 返回最后一个元素的下一个元素的迭代器
  33.     vector<int>::iterator EndIter = F.end();
  34.     EndIter--; //向后移一个位置
  35.     cout << *EndIter << endl; //输出9
  36.  
  37.     //vector::rbegin() 返回倒序的第一个元素,相当于最后一个元素
  38.     vector<int>::reverse_iterator ReverBeIter = F.rbegin();
  39.     cout << *ReverBeIter << endl; //输出9

  40.     //vector::rend() 反序的最后一个元素下一个位置,也相当于正序的第一个元素前一个位置
  41.     vector<int>::reverse_iterator ReverEnIter = F.rend();
  42.     ReverEnIter--;
  43.     cout << *ReverEnIter << endl; //输出0

  44.     //vector::size() 返回元素的个数
  45.     cout << F.size() << endl; //输出10

  46.     //vector::max_size()
  47.     cout << F.max_size() << endl; //输出1073741823,这个是极限元素个数

  48.     //vector::resize(N) 重新指定vector的容量,此时内部元素已调用构造函数即内存已经分配
  49.     cout << F.size() << endl; //输出10
  50.     F.resize(5);
  51.     for(int k = 0; k < F.size(); k++)
  52.         cout << F[k] << " "; //输出 0 1 2 3 4
  53.     cout << endl;
  54.     
  55.     //vector::capacity() 返回容器中最大可容纳的元素个数
  56.     cout << F.size() << endl; //5
  57.     cout << F.capacity() << endl; //10

  58.     //vector::empty()
  59.     B.resize(0);
  60.     cout << B.size() << endl; //0
  61.     cout << B.capacity() << endl; //10
  62.     cout << B.empty() << endl; //true

  63.     //vector::reserve() //重新分配存储空间大小
  64.     cout << C.capacity() << endl; //10
  65.     C.reserve(4);
  66.     cout << C.capacity() << endl; //10
  67.     C.reserve(14);
  68.     cout << C.capacity() << endl; //14
  69. /*关于resize()、reserve()、size()、capacity()的不同可查看下面的网页
  70.   http://blog.csdn.net/sodickbird/article/details/4594907
  71. */
  72.     
  73.     //vector::operator []
  74.     cout << F[0] << endl; //第一个元素是0

  75.     //vector::at()
  76.     try
  77.     {
  78.      cout << "F.size = " << F.size() << endl; //5
  79.            cout << F.at(6) << endl; //抛出异常
  80.     }
  81.     catch(out_of_range)
  82.     {    
  83.      cout << "at()访问越界" << endl;
  84.     }

  85.     //vector::front() 返回第一个元素的值
  86.     cout << F.front() << endl; //0

  87.     //vector::back()
  88.     cout << F.back() << endl; //4

  89.     //vector::assign()
  90.     cout << A.size() << endl; //0
  91.     vector<int>::iterator First = C.begin();
  92.     vector<int>::iterator End = C.end()-2;
  93.     A.assign(First,End);
  94.     cout << A.size() << endl; //8
  95.     cout << A.capacity() << endl; //8

  96.     A.assign(5,3); //将丢弃原来的所有元素然后重新赋值
  97.     cout << A.size() << endl; //5
  98.     cout << A.capacity() << endl; //8

  99.     //vector::push_back()
  100.     cout << *(F.end()-1) << endl; //4
  101.     F.push_back(100);
  102.     cout << *(F.end()-1) << endl; //100

  103.     //vector::pop_back()
  104.     cout << *(F.end()-1) << endl; //100
  105.     F.pop_back();
  106.     cout << *(F.end()-1) << endl; //4

  107.     //vector::swap()
  108.     F.swap(D); //交换这两个容器的内容
  109.     for(int f = 0; f < F.size(); f++)
  110.         cout << F[f] << " ";
  111.     cout << endl;
  112.     for (int d = 0; d < D.size(); d++)
  113.      cout << D[d] << " ";
  114.          cout << endl;
  115.     //vector::clear()
  116.     F.clear();
  117.     cout << F.size() << endl; //0
  118.     cout << F.capacity() << endl; //10

  119.     return 0;
  120. }

阅读(3659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~