STL ——vector 学习


 STL简介 
 C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等.  C++ STL 提供给程序员以下三类数据结构的实现: 标准容器类   顺序性容器  vector 从后面快速的插入与删除,直接访问任何元素  deque 从前面或后面快速的插入与删除,直接访问任何元素 list 双链表,从任何地方快速插入与删除   关联容器   set 快速查找,不允许重复值 multiset 快速查找,允许重复值  map 一对多映射,基于关键字快速查找,不允许重复值 multimap 一对多映射,基于关键字快速查找,允许重复值   容器适配器 stack 后进先出 queue 先进先出  priority_queue 最高优先级元素总是第一个出列 


程序员使用复杂数据结构的最困难的部分已经由STL完成. 如果程序员想使用包含int数据的stack, 他只要写出如下的代码: stack<int> myStack;  接下来, 他只要简单的调用 push() 和 pop() 函数来操作栈. 借助 C++ 模板的威力, 他可以指定任何的数据类型,不仅仅是int类型.  STL stack实现了栈的功能,而不管容纳的是什么数据类型.


 2顺序性容器  2.1 C++ Vector(向量容器)  是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。  在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据


3    存储,初始的空间大小可以预先指定也可以由vector 默认指定,这个大小即capacity ()函数的返回值。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:   首先,vector 会申请一块更大的内存块;  然后,将原来的数据拷贝到新的内存块中;   其次,销毁掉原内存块中的对象(调用对象的析构函数);  最后,将原来的内存空间释放掉。   如果vector 保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也是vector 被设计成比较容易拷贝的值类型的原因)。所以说vector 不是在什么情况下性能都好,只有在预先知道它大小的情况下vector 的性能才是最优的。  
 vector 的特点:  (1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。 (2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at()  (3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的。  (4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现是按照顺序表的原理。  (5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop 。 (6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。


如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化。这个由库生成的初始值将用来初始化容器中的每个元素,具体的值为何,取决于存储在vector中元素的数据类型。

如果vector保存内置类型如int,那么标准库将用0值创建元素初始化式

</pre><pre name="code" class="cpp">#include"cstdio"
#include"map"
#include"queue"
#include"vector"
#include"stack"
#include"string"
#include"algorithm"
#include"iostream"
using namespace std;
vector<int>v(4);  //定义一个向量V(相当于一个一维数组)
/*vector<T> v1             vector保存类型为T的对象。默认构造函数,v1为空  
vector<T> v2(v1)         v2是v1的一个副本  
vector<T> v3(n,i)        v3包含n个值为i的元素  
vector<T> v4(n)          v4含有值初始化的元素的n个副本  */
int main()
{
    v.push_back(4); //向V中加入一个元素2
    v.push_back(3);
    
    
    int t=v.back();  //返回最末一个元素
    
    
    for(int i=0;i<v.size();i++)  //下标访问各个元素
        printf("%d\n",v[i]);
        
    //begin,end 返回指向第一个、最后一个元素的指针 
    //若v不为空,iter指向v[0]。
    //由end返回的迭代器指向最后一个元素的下一个,不存在,若v为空,begin和end返回的相同
    vector<int>::iterator it;    //定义迭代器,可以遍历访问元素
    for(it=v.begin();it!=v.end();it++ )
    {                         
        *it=0;                    //将vector中的元素全部赋值为0
        printf("%d ",*it);               
    }
        
    int n=10;
    vector <int>g[n];  //定义一个二维向量
    
    g[2].push_back(3);
    g[3].push_back(2);
    
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<g[i].size();j++)
        {
            printf("%d ",g[i][j]);
        }
        puts("");
    }
    for(int i=0;i<=n;i++)     //清空容器
        g[i].clear();

    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值