stl

stl vector源码剖析

筅森魡賤 提交于 2020-01-30 02:33:58
前言 项目组要实现一个算法库,其中涉及到了类似vector的一维数组的实现。特此,对stl中得vector做个学习和了解。有任何问题,欢迎不吝指正。谢谢。 一、如何实现vector 如果给你一道面试题,如何用数据结构实现STL中vector的功能?聪明的你会怎么做呢?或许你会如下所述: 或许,如果不考虑分配效率,只需要两个成员就可以实现了 template <class _Ty> class Vector { public: Vector(int nLen=0):m_nLen(nLen),m_Data(NULL) { if(nLen > 0) { m_Data = new _Ty[nLen]; } } protected: _Ty * m_Data; int m_nLen; }; 或许,如下一个简单的思路实现: #include <iostream> using std::ostream; using std::istream; class Array { friend ostream &operator < <( ostream &, const Array & ); friend istream &operator> > ( istream &, Array & ); public: Array( int = 10 ); Array( const Array & );

STL之deque用法

和自甴很熟 提交于 2020-01-30 02:33:42
deque:双端队列 底层是一个双向链表。 常用的有队列的尾部入队、首部出队。 普通队列:queue queue 模板类的定义在<queue>头文件中。 与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类 型,元素类型是必要的,容器类型是可选的,默认为deque 类型。 定义queue 对象的示例代码如下: queue<int> q1; queue<double> q2; queue 的基本操作有: 入队,如例:q.push(x); 将x 接到队列的末端。 出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。 访问队首元素,如例:q.front(),即最早被压入队列的元素。 访问队尾元素,如例:q.back(),即最后被压入队列的元素。 判断队列空,如例:q.empty(),当队列空时,返回true。 访问队列中的元素个数,如例:q.size() 摘自: http://www.cnblogs.com/liubilan/p/9461141.html deque - 双向队列 1.构造 无参构造: deque<T> a;  //<>内自定义数据类型; 带参构造: deque(beg,end); //构造函数将[beg, end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。 deque(n,elem); /

【STL深入理解】vector

蓝咒 提交于 2020-01-30 02:28:33
这篇文章不打算讲述vector的基本用法,而是总结一下近期我大量阅读C++经典书籍时遇到的一些关于vector的容易忽略的知识点,特意将它们记录下来,以便以后查阅。 1.v[0]和v.at(0)的区别 void f(vector<int>& v) { v[0]; //A v.at(0); //B } 观察该函数,我们使用A和B的形式来访问v的元素,他们有什么区别?他们唯一区别就是如果v空则B会抛出std::out_of_range的异常,至于A行为标准未加任何说明。所以B方式可以防止越界操作,但是B方式较A方式效率要低(因为加入了越界检查)。 2.resize()和reserve()是不同的操作 int main() { vector<int> v; v.reserve(2); cout << "capacity: " << v.capacity() << endl; assert(v.capacity() == 2); v[0] = 1; //A v[1] = 2; //B return 0; } 上面的代码是有问题的,我在VS2015下进行编译运行时弹出“vector越界访问”的错误。那该段程序错在哪里? 首先这里的断言可能会失败。因为reserve操作将保证vector容量>=2。而且这里的断言也是多余的。 然后A和B的复制是有问题的,因为该程序忽视了resize

STL容器之vector

自作多情 提交于 2020-01-30 01:50:30
Vectors 包含着一系列连续存储的元素,其行为和数组类似。 访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。 vector定义了五种构造函数分别是: vector<T> v1; vector<T> v2(v1); vector<T> v3(b, e) vector<T> v4(n, i); vector<T> v5(n); vector包含如下接口函数,如需详细了解,请参阅相关帮助文档 Constructors 构造函数 Operators 对vector进行赋值或比较 assign() 对Vector中的元素赋值 at() 返回指定位置的元素 back() 返回最末一个元素 begin() 返回第一个元素的迭代器 capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下) clear() 清空所有元素 empty() 判断Vector是否为空(返回true时为空) end() 返回最末元素的迭代器(译注:实指向最末元素的下一个位置) erase() 删除指定元素 front() 返回第一个元素 get_allocator() 返回vector的内存分配器 insert() 插入元素到Vector中 max_size()

STL之priority_queue使用简介

点点圈 提交于 2020-01-30 00:56:15
优先队列容器也是一种从一端入队,另一端出对的队列。不同于一般队列的是,队列中最大的元素总是位于队首位置,因此,元素的出对并非按照先进先出的要求,将最先入队的元素出对,而是将当前队列中的最大元素出对。 C++ STL 优先队列的泛化,底层默认采用 vector 向量容器,使得队列容器的元素可做数组操作,从而应用堆算法找出当前队列最大元素,并将它调整到队首位置,确保最大元素出队。 堆算法(heap algorithm) 具有 nLog(n) 阶的算法时间复杂度,优先队列也可看作容器适配器,将底层的序列容器 vector 转换为优先队列 priority_queue. priority_queue 优先队列容器的 C++ 标准头文件也是 queue ,需要用宏语句 "#include <queue>" 包含进来。 同样是因为仅需取队首和队尾元素的操作,因此 priority_queue 优先队列容器也不提供迭代器,对其他任意位置处的元素进行直接访问操作。使用时,一般用 priority_queue<T> 的形式进行具现, T 是优先队列元素的一个具现类型。 创建 priority_queue 对象 使用 priority_queue 队列之前,要先利用构造函数生成一个优先对象,才可进行元素的入队、出对、取队首及队尾等操作。 1. priority_queue() 默认的构造函数

学习C++从入门到精通的的十本最经典书籍

孤街浪徒 提交于 2020-01-30 00:52:59
(一)语言入门: 《C++ Primer》 适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。 《The C++ Programming Language》/《C++程序设计语言》 最新版本:第三版特别版 简称TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来) 《Essential C++》 《Accelerated C++》 这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。 以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。 (二)进阶A: 这个路线侧重于语言本身 《Effective C++》 最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中) 简称EC。C++程序员必读!很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走)到书店去购买Scott Mayer的《Effective C++》,可能还要《More Effective C++》”。 《C++

学习C++从入门到精通的的十本最经典书籍

≯℡__Kan透↙ 提交于 2020-01-30 00:50:51
java和c++学习路线 - burkun的专栏 - 博客频道 - CSDN.NET 学习C++从入门到精通的的十本最经典书籍 (一)语言入门: 《C++ Primer》 适合有丰富C经验,缺乏C++经验的。不过我个人一直认为此书带着过于强烈的C语言的痕迹,对于C++的学习未必是好事。 《The C++ Programming Language》/《C++程序设计语言》 最新版本:第三版特别版 简称TC++PL,有其他语言的丰富经验的。(也有人简称之为“TCPL”,但需与另一本《The C Programmer Language》区分开来) 《Essential C++》 《Accelerated C++》 这两本薄一些,都是不错的选择。《Accelerated C++》本人没有读过,从各方面的评价来看,完全值得推荐。 以上几本书都有相应的中文版,而且翻译的质量都不错。上面的书未必都需要读一遍,但无论如何,TC++PL是应该阅读的。 (二)进阶A: 这个路线侧重于语言本身 《Effective C++》 最新版本:第二版(第三版国外已上架,国内一些网上书店也在预订中) 简称EC。C++程序员必读!很多时候,我们说C++圣经不是指TC++PL,而是这一本。《The Pragmatic Programmer》一书中写到:“一旦你发现自己要参与C++项目的开发,赶快跑(不要走

C++ STL之vector用法总结

混江龙づ霸主 提交于 2020-01-30 00:49:38
C++ STL之vector用法总结 介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。 vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。 与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward

【总集】C++ STL类库 vector 使用方法

ぐ巨炮叔叔 提交于 2020-01-30 00:44:47
介绍: 1.vector 的中文名为向量,可以理解为一个序列容器,里面存放的是相同的数据结构类型,类似于数组但与数组又有微妙的不同。 2.vector 采用的是连续动态的空间来存储数据,它是动态的数组,它不仅可以使用下标访问每一个位置的数据,还可以对它的长度进行改变,十分的灵活。但是它的灵活也是有代价的,我们都知道,数组在内存中的长度是开始声明的时候就已经确定好了,要改变长度,就意味着需要重新的去申请空间,再将需要的元素移动到这个空间中,在释放原来的空间,但是 vector 对内存的处理 或许 并不是这样的,无论我们加多少个值或是删除多少个值来改变 vector 的 size,vector 的头地址始终是不变的,这可能和它的内部实现有关,在这里我也不追究了。 3.vector 同时也有许多的函数方法可以调用,方便我们的数据处理以及内存空间的管理。 4.vector 与其他的序列容器相比 (list, forward_lists, deque 等),vector 适合于随机的访问元素,在需要很多随机增删操作的情况下,或许 vector 就没有那么的好用了。 5.vector 在大多数的情况下还是作为动态来使用,一般用来求解线性的题目。 主要的函数方法以及实例化: 首先需要包含头文件 <vector> 实例化一个 vector:因为 vector 是一个模板类

STL之vector

痞子三分冷 提交于 2020-01-30 00:43:08
vector STL vector的内部实现原理及基本用法 初始化vector对象的方式: vector v1; //未指定初始化方式,因此采用默认方式初始化v1,即长度为0的空容器; vector v2; //定义对象v2,作为v1的副本; vector v3(n,i);//定义对象v3,它包含n个数值为i的元素; vector v4(n); //定义对象v4,v4中包含n个元素,每个元素的值均是0; 其中:T可以为int,float,char,char*(存放字符串或字符指针)。一般用于int动态数值时,定义vector v1,用v1来保存数值元素。 vector的常用函数:只需要包含#include 即可 empty():判断vector向量是否为为空,为空时返回真,否则返回假; begin():返回向量(数组)的首元素的地址; end():返回向量(数组)的末尾元素的下一个元素(不存在的元素)的地址; clear():清空向量; front():返回向量(数组)的第一个元素的数据; back():返回向量(数组)的最后一个元素的数据; size():返回向量中元素的个数(即数组长度) push_back(数据i):将数据插入到向量的尾部; pop_back():删除向量尾部的数据 // vector_base.cpp : 定义控制台应用程序的入口点。 // #include