点击查看Evernote原文

#@author:       gr
#@date: 2014-08-11
#@email: forgerui@gmail.com

vector的相关问题。《stl学习》将按内容进行整理,不再把所有内容放到一个文件中。

###stl学习

 |--迭代器

 |--类属算法

 |--容器

   |--vector

   |--deque

   |--list

   |--set

   |--map

 |--函数对象

 |--适配器

 |--分配器

一、Contents

1. 强大的迭代器

因为vector的迭代器是随机迭代器,即最强大的迭代器,所以一般的类属算法都可以支持. 如sort算法, list(链表)便不支持sort类属算法, 而对list增加了sort成员函数.

2. vector构造函数

int n = 10;
//初始n个"T value"
vector<T> v1(n, value);
//第二个参数是默认参数,默认为T(),向量的每个成员都是T()的拷贝构造函数得来,
//可以理解为先使用T a初始化一个对象a,之后每个向量的元素都是调用拷贝构造函数T(T& a)得来的对象
vector<T> v2(n);
//从其它容器中拷贝
char a[] = "hello";
vector<char> v3(a, a+5);
vector<int> v4(list1.begin(), list1.end());

3. 插入

vector提供了随机访问的功能,说明其访问时间是常数的,但其插入和删除时间则是线性的。所以,在末尾插入用vector, 在末尾和头部插入用双向队列(deque),大量进行插入删除操作时使用链表(list)。

//push_back压入最后
vector<int> v;
v.push_back(2);
//insert插入任何位置
v.insert(position, value);

4. capacity与size

capacity: 向量已经申请到的内存空间大小

size: 向量已经分配元素的大小

一般,capacity() >= size()

5. vector的内存分配问题

当初始化一个空vector时,默认内存大小为0;可以通过capacity查看。

第一次申请空间大小个数为1024,如果使用空间超过capacity,再次插入时就会扩大2倍

具体做法是重新申请原来内存2倍的空间,并将原来的数据拷贝到新申请的内存中,释放掉原来的内存。这样做的原因是vector需要按顺序连续存储在一段空间中。虽然,重新分配内存和拷贝数据需要很大的开销,但这种情况很少出现一次,把它平均分摊到每个插入操作,复杂度仍可以维持在常数

//初始化一个空向量
vector<int> a;
assert(a.capacity() == 0);
//增加内存,申请大小为1024
a.push_back(1);
assert(a.capacity() == 1024);

6.使用reserve提高效率

上面提到,vector动态申请内存的开销问题,如果可以事先确定需要的大小,可以使用reserve一次性申请这段空间。

//不提前申请空间,需要申请多次,1024,2048,4096,8192,16384,造成了多次开销
vector<int> v1;
for(int i=0; i<1000; i++){
v1.push_back(i);
}
//一次性申请10000空间,可以有效减少开销
vector<int> v2;
v2.reserve(10000);
for(int i=0; i<1000; i++){
v1.push_back(i);
}

7. 删除

在删除末尾以外地方的元素需要将后面的元素进行移动,时间复杂度是线性的。删除点之后的迭代器失效,所以erase(j++)是值得考量的;

//pop_back
vector<int> a;
a.pop_back();
//erase,删除position位置上的元素
a.erase(position);
//erase,删除[first, last)上的元素
a.erase(iterator first, iterator last);
//删除向量v1的第一个元素
a.erase(v1.begin());

8. 访问器

访问器是vector的成员函数,只获取向量的信息,不改变向量的状态。

size_type  size(), capacity(),
iterator begin(), end()
reference front(), back(), [], at()
bool empty()

9. 向量的swap函数

部分特殊化定义(partial specialization):将模板参数类型更加具体化

当存在两个模板函数时,特殊化程度高的函数会被调用。这样,各个容器的swap函数会比最普通的swap调用的优先级更高。实现了针对各个容器的快速算法,这些容器的swap函数都是常数的时间复杂度。

//最普适的swap
template <typename T>
void swap(T& a, T& b){
T temp = a;
a = b;
b = temp;
}
//特殊化的swap,将T变为vector<U>,当遇到vector时,会先调用这个swap
template <typename U>
void swap(vector<U>& a, vector<U>& b){
a.swap(b);
}
//调用swap,优先使用向量的swap,即有vector1.swap(vector2);
swap(vector1, vector2);

二、Miscellany

@author gr
@mail forgerui@gmail.com

###STL学习--vector的更多相关文章

  1. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  2. STL学习:STL库vector、string、set、map用法

    本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...

  3. Effective STL 学习笔记: 多用 vector & string

    Effective STL 学习笔记: 多用 vector & string 如果可能的话, 尽量避免自己去写动态分配的数组,转而使用 vector 和 string . 原书作者唯一想到的一 ...

  4. 侯捷STL学习(七)--深度探索vector&&array

    layout: post title: 侯捷STL学习(七) date: 2017-06-13 tag: 侯捷STL --- 第十六节 深度探索vector vector源码剖析 vector内存2倍 ...

  5. C++STL之Vector向量详解,用法和例子 一起学习 一起加油

                                                                                    C++ STL之vector用法总结 1 ...

  6. STL学习笔记序言

    笔者作为计算机科学与技术专业的学生,学习并使用C++已经有3年了.在接触STL之前的编程习惯是,所有程序的功能包括数据结构.算法等都是亲自实现,效率极其缓慢.后来从使用STL的vector开始慢慢的感 ...

  7. ###STL学习--关联容器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...

  8. ###STL学习--迭代器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的迭代器. ###stl学习 |--迭代 ...

  9. ###STL学习--函数对象

    点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...

随机推荐

  1. [置顶] Flex中Tree组件无刷新删除节点

    在Tree组件中经常要删除某个节点,而删除之后重新刷新加载该Tree组件会影响整个操作效果和效率,因此,无刷新删除就比较好,既删除了节点也没有刷新tree,而使Tree的状态处于删除之前的状态. 无刷 ...

  2. 解决eclipse 使用run运行,始终会跳到debug模式!

    查看此选项是否选择中卫always,若是,更改为never或prompt,重启eclipse即可

  3. 【Away3D代码解读】(三):渲染核心流程(渲染)

    还是老样子,我们还是需要先简略的看一下View3D中render方法的渲染代码,已添加注释: //如果使用了 Filter3D 的话会判断是否需要渲染深度图, 如果需要的话会在实际渲染之前先渲染深度图 ...

  4. 如何创建一个有System用户权限的命令行

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:如何创建一个有System用户权限的命令行.

  5. JAVA常用设计模式整理

    设计模式:一个程序员对设计模式的理解:“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把 ...

  6. Notes(一)

    Numerous experimental measurements in spatially complex systems have revealed anomalous diffusion in ...

  7. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简单介绍 1. 状态保存方法演示 ...

  8. Android模拟器操作快捷键

    你可以通过模拟器的启动选项和控制台命令来控制模拟环境的行为和特性.一旦模拟器启动,你就可以通过键盘和鼠标来“按” 模拟器的按键,从而操作模拟器.下面的表格总结了模拟器按键可键盘按键之间的映射关系. 模 ...

  9. iOS开发——开发技巧&Mac常用命令

    现实和隐藏文件拓展名 显示:defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder 隐藏:def ...

  10. iOS开发——swift精讲&MVC应用实战

    MVC应用实战 iOS开发中设计模式是很重要的,其中,使用最多的就是MVC模式,今天就简单介绍一下在Swift中这么使用MVC模式来实现我们想要的功能: 模型-视图-控制器(Model-View-Co ...