STL源代码学习--vector用法汇总
一、容器vector
使用vector你必须包含头文件<vector>:
#include<vector>
型别vector是一个定义于namespace std内的template:
- template<class _Ty,
- class _Ax = allocator<_Ty> >
第二个參数定义内存模型。
我们一般採用默认的内存模型。
二、vector的功能
vector模塑出一个动态数组。vector将其元拷贝到内部的动态数组中。
元素之间总是存在某种顺序,它是一种有序群集。
支持随即存取。
它的迭代器是随机存取迭代器。所以对不论什么一个STL算法都奏效。
向vector加入一个元素或者删除当中的一个元素,其后的全部元素都要移动位置,每一次移动都要调用赋值操作符。
所以。在末端加入或删除元素,性能非常好。
可是在前段或者中部的话。性能较差。
vector优异性能的秘诀之中的一个是它配置比其所容纳的元素所需很多其它的内存。我们须要了解大小和容量的关系。
函数size()能够返回vector的大小。即vector中实际元素的个数。
而capacity()返回容量。是当前的vector所实际可以容纳的元素的数量。它应该总是大于或者等于vector的大小。
假设须要向vector中放置比capacity很多其它的元素。则须要又一次配置内部存储器。
vector的容量也会随之增长。
看以下的演示样例代码:
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- using namespace std;
- int main()
- {
- vector<string> sentence(1);
- cout << "max_size():" << sentence.max_size() << endl;
- cout << "size():" << sentence.size() << endl;
- cout << "capacity():" << sentence.capacity() << endl;
- sentence.reserve(5);
- sentence.push_back("Hello,");
- sentence.push_back("how ");
- sentence.push_back("are ");
- sentence.push_back("you ");
- sentence.push_back("?");
- copy(sentence.begin(),sentence.end(),
- ostream_iterator<string>(cout," "));
- cout << endl;
- cout << "max_size():" << sentence.max_size() << endl;
- cout << "size():" << sentence.size() << endl;
- cout << "capacity():" << sentence.capacity() << endl;
- swap(sentence[1],sentence[3]);
- sentence.insert(find(sentence.begin(),sentence.end(),"?"),
- "always");
- sentence.back() = "!";
- copy(sentence.begin(),sentence.end(),
- ostream_iterator<string>(cout," "));
- cout << endl;
- cout << "max_size():" << sentence.max_size() << endl;
- cout << "size():" << sentence.size() << endl;
- cout << "capacity():" << sentence.capacity() << endl;
- }
执行结果:

在程序中。当再次向vector插入元素时。因为vector的容量不够,所以引起了内存的又一次分配。可是capacity()的结果与实作版本号有关,max_size也是。
vector的容量十分重要,是由于:
1、一旦内存又一次配置,与之相关的全部的reference、pointers、iterators都会失效。
2、内存配置非常费时。
解决问题的方法有:
1、能够使用reserve()保留适当容量,降低又一次配置内存的次数。演示样例代码:
- vector<string> sentence(1);
- sentence.reserve(50);
2、在初始化期间向构造函数传递附加參数。构造出足够的空间。
- vector<T> v(5);
当然,这样的元素的型别必须提供默认构造函数。可是假设元素的型别比較复杂,初始化操作也非常耗时。
假设仅仅是为了保留足够的内存。用法1较好。
注意:reserve不能缩减vector的容量。由此,我们能够知道。即使删除元素。其reference、pointers、iterators也会继续有效,指向动作发生前的位置。
可是插入操作可能使reference、pointers、iterators失效(由于可能会导致又一次配置空间)。
使用swap函数能够缩减vector容量。
由于两个vector交换内容后,他们的容量也会互换。
1、
- template<class T>
- void shrinkCapacity(vector<T> &v)
- {
- vector<T> tmp(v);
- v.swap(tmp);
- }
2、
- vector<T>(v).swap(v);
上面两种方法等价。
都是先构造出一个暂时vector对象,以v的元素进行初始化,再与v进行交换。
须要注意的是:暂时对象一般都是精确分配实际所需的内存。
所以可以起到减小vector容量的效果。
三、vector的操作函数
全部的构造函数和析构函数例如以下:

非变动性操作:

赋值操作:

上述操作进行的是将新元素赋值给vector,并将旧元素所有移除!演示样例代码:
- #include <iostream>
- #include <vector>
- #include <string>
- #include <algorithm>
- using namespace std;
- int main()
- {
- vector<string> sentence(1);
- cout << "max_size():" << sentence.max_size() << endl;
- cout << "size():" << sentence.size() << endl;
- cout << "capacity():" << sentence.capacity() << endl;
- sentence.reserve(5);
- sentence.push_back("Hello,");
- sentence.push_back("how ");
- sentence.push_back("are ");
- sentence.push_back("you ");
- sentence.push_back("?
");
- copy(sentence.begin(),sentence.end(),
- ostream_iterator<string>(cout," "));
- cout << endl;
- sentence.assign(3,"new");
- copy(sentence.begin(),sentence.end(),
- ostream_iterator<string>(cout," "));
- cout << endl;
- }
执行结果:

能够看出原来的元素所有被删除了。
元素存取

在这几个函数中,唯一进行下标检查的是at函数。
因此。在调用operator[]的时候,必须心理清楚索引是否是有效的。
迭代器相关函数

迭代器失效的两种情况是:
1、在一个较小的位置上删除或者是移动元素。
2、因为容量的变换引起内存又一次分配。
插入和移除元素

插入和移除元素。都会使“作用点”之后的各元素的reference、pointers、iterators失效。插入操作还可能引发内存又一次分配,那么该容器上的全部的reference、pointers、iterators都会失效。
四、把vector当做一般数组使用
如今的C++标准保证vector的元素必须分布于连续空间中。对于vector中的一个合法索引,满足下列表达式:
&v[i] = &v[0] + i;
我们必须保证vector可以容纳全部数据。
假设使用的是C-String,记住最后有个'\0'。
仅仅要我们须要一个元素型别为T的数组,就能够採用vector<T>,然后传递第一个元素的地址给它。
注意:千万不要把迭代器当做第一元素的地址来传递。由于vector迭代器是由实作版本号定义的,不一定是一个一般指针。
- printf("%s",v.begin());//ERROR(might work,but not portable)
- printf("%s",&v[0]);//OK
STL源代码学习--vector用法汇总的更多相关文章
- STL源代码学习(vector篇)
#include <concept_checks.h> #include<stl_allocate.h> /// The vector base class's constru ...
- C++ STL源代码学习(map,set内部heap篇)
stl_heap.h ///STL中使用的是大顶堆 /// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap ...
- C++ STL源代码学习之算法篇
///因为篇幅太长,因此,删去了非常多接口,仅仅分析了内部实现,算法对迭代器的要求也被删去 /// search. template <class _ForwardIter1, class _F ...
- C++ STL常用容器基本用法汇总
1.vector 包含头文件#include<vector> 使用命名域using namespace std 定义元素类型为T的vector vector<T> vec 增: ...
- C++ STL源代码学习(list篇)
///STL list为双向循环链表 struct _List_node_base { _List_node_base* _M_next; _List_node_base* _M_prev; }; t ...
- C++ STL 源代码学习(之deque篇)
stl_deque.h /** Class invariants: * For any nonsingular iterator i: * i.node is the address of an el ...
- C++STL源代码学习(之slist篇)
///stl_slist.h ///list为双向循环链表,slist为单向链表.某些操作效率更高 ///slist是SGI额外提供的单向链表,不属于C++标准 struct _Slist_node_ ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- STL中的Vector相关用法
STL中的Vector相关用法 标准库vector类型使用需要的头文件:#include <vector>. vector 是一个类模板,不是一种数据类型,vector<int> ...
随机推荐
- 谈谈Command对象与数据检索
摘要 到目前为止,我相信大家对于ADO.NET如何与外部数据源建立连接以及如何提高连接性能等相关知识已经牢固于心了.连接对象作为ADO.NET的主力先锋,为用户与数据库交互搭建了扎实的桥梁.它的一生是 ...
- Java核心技术 卷Ⅰ 基础知识(5)
第11章 异常.断言.日志和调试 处理错误 异常分类 声明已检查异常 如何抛出异常 创建异常类 捕获异常 捕获多个异常 再次抛出异常与异常链 finally子句 带资源的try语句 分析堆栈跟踪元素 ...
- 关于VUE的安装和一些简单属性
安装vue 安装前初始化package.json 主要用来描述自己的项目,记录安装过得文件有哪些,在当前文件夹下生产json 安装vue --save(-S)代表项目依赖 --save-dev(-D) ...
- 最新GitHub账号注册(详细图解)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.简介 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub. ...
- 3、Unicode\UTF-8\GBK 区别和联系
字符编码:Unicode和UTF-8之间的关系 可以参考下面blog:https://blog.csdn.net/xiaolei1021/article/details/52093706/ 这篇文章写 ...
- VS无法访问IIS元数据库 您没有足够的特权访问计算机上的IIS网站
进入windows\regedit.exe下的HKEY_CRRENT_USER\Software\Microsoft\Windows\CurrentVersion\Exploer\User Shell ...
- 自己定义Dialog的具体步骤(实现自己定义样式一般原理)
转载请标注转载http://blog.csdn.net/oqihaogongyuan/article/details/50958659 自己定义Dialog的具体步骤(实现自己定义样式一般原理) ...
- Dll的链接使用细节
关于Dll Dll.Exe 都是PE格式的二进制文件. Dll相当于Linux操作系统下的so文件 1 基地址(Base Address)和相对地址(RelativeVirtual Address) ...
- 如何使stm32程序更好移植, 结构体相当于define
原创:转载请标注引用地址 如何定义 led1对应于PA8 呢 :对于我一开始学习的方法:: #include "main.h" #define led1 GPIO_Pi ...
- Your algorithm's runtime complexity must be in the order of O(log n).
Given a sorted array of integers, find the starting and ending position of a given target value. You ...