STL中vector是通常作为数组使用,不过它更像一个动态数组,在实际项目开发中大量使用.
优点:存储空间连续,可以使用下标访问,时间复杂度O(1).
缺点:不适合从中间删除和添加元素.
C++标准规定的vector模板声明:

template < class T, class Allocator = allocator<T> > class vector;

T : 存储的数据类型
Allocator : 存储空间分配器(默认为std::allocator<T>)

1)首先vector可以作为数组使用,因此我们可以在初始化vector时,指定元素个数和初始值.
vector<int> v;        //v中含有0个元素
vector<int> v(5);     //v中含有5个元素
vector<int> v(5, 1);  //v中含有5个元素,赋予初始值1

另外vector还可以通过其他方式构造:
vector<int> third (v.begin(),v.end());  //通过v构造third
vector<int> fourth (third); //通过copy构造

//通过数组进行初始化
int myints[] = {16,2,77,29};
vector<int> fifth (myints, myints + sizeof(myints) / sizeof(int) );
这里暂且介绍这几种,更多构造方式查看C++手册.

2)其次我们要介绍下vector对内存的管理.
vector成员函数: size_type size() const;返回当前容器中元素个数
                size_type capacity() const;返回当前容量大小(并不一定等于size())
vector为了减少内存频繁申请和释放capacity()返回的是当前容器实际申请内存空间所能容纳的元素个数,当我们在容器添加元素个数大于capacity()的大小时,容器将通过内存分配器重新分配空间(注: 一旦size()中的元素被移除掉, 被移除的对象对应的析构函数将会被调用.).
下面我们通过例子具体看看:
程序1:
    vector<int> v;
    for (size_t i = 0; i < 100; ++ i)
        v.push_back(i);

cout << v.size() << endl;
    cout << v.capacity() << endl;
输出:
100
141
可以看到size() 和 capacity()大小不一致.在vs中我们追踪push_back函数可以看到

首先比较size()和capacity()大小,如果容器容量足够容纳元素则直接添加至尾部,否则我们进入insert函数继续追踪,
进入_Insert_n中,我们看到一旦新添加元素数量和当前实际使用元素数量大于capacity()后,则容器容量尝试以50%的容量增长.
 
vector的成员函数: void resize ( size_type sz, T c = T() );改变实际元素个数.
1.如果_Newsize小于size(),则容器将截断后面(size() - _Newsize)个元素, 保留前面的元素;
2.如果_Newsize大于size(),则容器将调用_Insert_n函数进行插入操作,只有(_Newsize - size())的元素才使用初始化值进行初始化,原来的size()个元素保持不变.
 
vector成员函数: void reserve ( size_type n );改变容器容量大小.
1.如果n小于capacity()大小,则容器并不会进行释放内存重新分配,此操作无效.
2.如果n大于capacity()大小,则容器重新分配内存,并将原来元素copy进新的内存中.
程序2:
     vector<int > v;
    for (size_t i = 0; i < 100; ++ i )
        v.push_back (i);
 
    v.reserve (10);
 
    cout << v .size() << endl;
    cout << v .capacity() << endl;
输出:
100
141
 
程序3:
     vector<int > v;
    for (size_t i = 0; i < 100; ++ i )
        v.push_back (i);
 
    v.reserve (150);
 
    cout << v .size() << endl;
    cout << v .capacity() << endl;
输出:
100
150
 
vector的clear()操作并不会造成内存的释放,只是改变实际元素个数置为0;而iterator erase ( iterator position );操作也只是对元素进行移动操作,并不会释放内存.
 
总结:我们在使用vector时最好事先分配一定的数量的元素空间,删除和添加最好在尾部操作. 

STL总结之vector的更多相关文章

  1. 转:用STL中的vector动态开辟二维数组

    用STL中的vector动态开辟二维数组 源代码:#include <iostream>#include <vector>using namespace std;int mai ...

  2. STL中的Vector相关用法

    STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...

  3. (转)C++ STL中的vector的内存分配与释放

    C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...

  4. C++STL中的vector的简单实用

    [原创] 使用C++STL中的vector, #include <stdio.h> #include<stdlib.h> #include<vector> usin ...

  5. STL中的vector实现邻接表

    /* STL中的vector实现邻接表 2014-4-2 08:28:45 */ #include <iostream> #include <vector> #include  ...

  6. C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法

    每次忘记都去查,真难啊 /* C/C++解题常用STL大礼包 含vector,map,set,queue(含优先队列) ,stack的常用用法 */ /* vector常用用法 */ //头文件 #i ...

  7. [转] C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http://www.169it.com/article/3215620760.html http://www.cnblogs.com/sharpfeng/archive/2012/09/18/269 ...

  8. Linux环境下stl库使用(vector)

    step1: #include <iostream> #include <vector> #include <string> using namespace std ...

  9. stl 中List vector deque区别

    stl提供了三个最基本的容器:vector,list,deque.         vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此     它能非常好的支持随 ...

随机推荐

  1. 让hyper-v虚拟机中类ubuntu系统可以全屏

    很久之前一直都没有方法让linux虚拟机支持hyper-v的全屏,只能以1024x768或者800x600等方形屏幕 如果是windows7以前的电脑,可以用mstsc远程桌面修改分辨率,window ...

  2. "严格模式" use strict 详解

    一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. ...

  3. python实用函数

    dir([obj]) 显示对象属性, 无参数显示全局变量的名字 help([obj]) 显示对象的文档字符串 int(obj) 将一个对象转换为整数 len(obj) 返回对象的长度 range([[ ...

  4. 说说对C语言指针的理解

    指针困扰了一些学习编程的人,或许你的老师会告诉你,指针比较难理解. 我当时被老师的话唬住所以学习指针那章的时候都没心情听课.(说得像讲别的内容时我听了似的,开玩笑) 导致了学习链表的时候各种卧槽. * ...

  5. Qt 5 常见错误汇总

    1.没加 QT+=sql,需要再.pro文件中加上 2.无故崩溃,这个有多种原因,多为指针问题,例如,指针内存泄露,指针未开辟空间直接使用,UI还未建立就使用UI里面的东西..等等 3.Sql问题,有 ...

  6. SDC(4)–set_clock_groups 与–add选项

    1,set_clock_groups  -exclusive 有多个时钟,但是多个时钟不会同时生效 例如: 2,-add 只有一个时钟输入源,但是始终的频率等可能变 例如:

  7. Appdelegate 导航操作

    隐藏返回按钮 self.navigationItem.hidesBackButton = YES; 设置导航的透明度 self.navigationController.navigationBar.t ...

  8. 【软件分享】文本对比工具 Beyond Compare

    转载自公众号:EmbeddDeveloper 对嵌入式感兴趣可以关注原作者博客: http://blog.csdn.net/ybhuangfugui 此处转载为分享用 Ⅰ.摘要 Beyond Comp ...

  9. 如何在一整张背景图中,加隐形的a标签

    很常见的一个需求,就上图每个国家图标都得加上各自指定的a标签 这时,我们就可以去加上隐藏且定位准确的几个a标签 这个时候,主要用到的就是text-indent和overflow 这两个属性的配合.te ...

  10. 对html进行SEO的一点点总结

    1. 要考虑用户用哪些关键在查找您的网页 2. SE无法识别图形中的内容 3. 确保title和alt中的内容准确 4. 尽量用静态页,如果是动态页,参数要少 5. 每个图片都尽量用alt 6. 不用 ...