STL (1)vector

感觉自己对STL的很多东西还是不够明确,趁这个机会把这些内容整理一下,顺便明确化一些模糊的点.

STL六大组件 容器,算法,迭代器,仿函数,适配器,分配器.   基本也是按照常用顺序排列

容器,现在理解起来就是数据的组织方式.

          数组,原生数组

          vector用于替代原数组,一定程度上解决了数组开大了浪费,开小了不够的问题.vector实现动态增加的方式很简单,大小不够了,就重新拷贝到一块新的更大的空间,默认是1.5倍原大小

         注意:vector内部自动扩容的时候会将原空间析构,重新开辟的新空间会拷贝构造原值.     这使得对拷贝构造,析构有要求的自定义类型要注意.比如计数智能指针.

     而且很容易想到,如果是大类型,每一次扩容会产生不少的性能损耗,必要的时候 可以通过reserve方法指定大小,避免小空间时频繁拷贝构造析构,甚至有时要自己写个memcpy的浅拷贝vector

    vector的方法,想出来一个算一个,     push_back(),尾插入一个元素,会拷贝构造插入对象,参数是const引用, c++11中建议用emplace_back替代,emplace_back会在尾位置构造.也就是说,当explicit修饰了有参构造的化,push_back(参数)是编译不通过的,而emplcae_back(参数)可以,如图,      当容量大于size时,非基本类型e_p效率高于p_b,容量不够,都会先开辟新空间

我就觉得根本没有什么明确的六大组件什么的.或许这也是STL的无奈.STL中并不是全部都是界限明确的.比如,bitset,位图,就没法弄出迭代器,更别说sort什么的, 如果说,迭代器算法是专属STL设计的,那么为什么普通数组也可以调用 algorithm中的sort(),实际中传入指针而不是迭代器就行,又比如string,也有自己的迭代器.....那么string也是STL一部分吗???我思来想去,只能说明,STL是不断地修修补补,不去纠结界限分明,只要好用就行,实际上来说,我觉得这是一个非常浩大艰巨的工程,能做到这个程度,尽可能的方便后人,通用,非常了不起了.

甚至我觉得应该把STL融为语言的本身,能更好的解决更多问题.可以也许是受限于"0代价抽象"又或是"包罗万象",C++在某些问题上显得非常纠结,比如STL另一个巨坑----默认的STL是会抛异常的,比如stack已经空的时候仍然pop,这使得在写某些代码的时候要小心谨慎,或者禁用异常,(好像是加入一些宏定义)

vector的常用操作

v1.push_back()   //在数组的最后添加一个数据
v1.pop_back()    //去掉数组的最后一个数据 v1.front()     //返回第一个元素(栈顶元素)
v1.begin()           //得到数组头的指针,用迭代器接受
v1.end()             //得到数组的最后一个单元+1的指针,用迭代器接受
v1.clear()        // 移除容器中所有数据
v1.empty()         //判断容器是否为空
v1.erase(pos)        //删除pos位置的数据
v1.erase(beg,end)// 删除[beg,end)区间的数据
v1.size()         //回容器中实际数据的个数v1.insert(pos,data) //在pos处插入数据

我个人觉得vector可以替代stack,而且还能在某些场景下遍历,比如我常常遇到的DFS到底的时候输出,stack就是少打个_back吧

vector使用时始终要记得,它本质还是个数组

我所遇到的vector的坑点也就在上面写到了,以后遇到其他再添加吧

  

原文地址:https://www.cnblogs.com/slowman/p/10111639.html

时间: 2024-11-11 16:59:32

STL (1)vector的相关文章

【C++】STL,vector容器操作

C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化vector< typeName > v1;       //默认v1为

STL之vector

今天学习了STL 以前用的c,可是比赛回来发现c有点弱,c++的stl是比较实用的,适合比赛.所以学习了一下. vector. 这是一个容器,其实就是线性表. 使用之前在头部加上#include <vector> 然后就可以使用 vector<type> vec; //type is a kind of basic type (eg. int double ..) 然后访问这个表的时候需要声明一个变量 vector<type>::iterator ite; 然后就可以用

C++ STL:vector

  不定长数组:vetor 它就像一个二维数组,只是第一维的大小是固定的,但是第二维的大小不固定. 下面是一些尝试代码: 1. <pre name="code" class="cpp"> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<vec

带你深入理解STL之Vector容器

C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. STL实现了一个Vector容器,该容器就是来改善数组的缺点.vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充以容纳新元素.因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,再也不必因为害怕空间不足而一开始就配置一个大容量数组了,vector是用多少就分配多少. 要

【STL】- vector的使用

初始化: 1. 默认构造: vector<int> vint; 2. 用包含10个元素的数组初始化: vector<int> vint(ia, ia+10); 算法: 1. vint.push_back(i); 2. vint.size(); 3. vint[i]; 代码: 1 #include <vector> 2 #include <iostream> 3 using namespace std; 4 5 int ia[] = {123,1,32,53,

【STL】vector的insert方法详解

#include<vector> #include<iostream> using namespace std; int main() { vector<int> v(3); v[0]=2; v[1]=7; v[2]=9; v.insert(v.begin(),8);//在最前面插入新元素. v.insert(v.begin()+2,1);//在迭代器中第二个元素前插入新元素 v.insert(v.end(),3);//在向量末尾追加新元素. vector<int

C++的STL中vector内存分配方法的简单探索

STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio.h> using namespace std; int main() { vector<int> x_vec; printf("data size : [%3d], mem size : [%3d]\n", x_vec.size(), x_vec.capacity())

STL容器 vector,list,deque 性能比较

C++的STL模板库中提供了3种容器类:vector,list,deque对于这三种容器,在觉得好用的同时,经常会让我们困惑应该选择哪一种来实现我们的逻辑.在少量数据操作的程序中随便哪一种用起来感觉差别并不是很大,但是当数据达到一定数量后,会明显感觉性能上有很大差异. 本文就试图从介绍,以及性能比较两个方面来讨论这个问题. vector - 会自动增长的数组 list - 擅长插入删除的链表 deque - 拥有vector和list两者优点的双端队列 性能竞技场 性能总结与使用建议 测试程序清

STL学习——Vector篇

STL学习--Vector篇 vector简介 vector的数据安排及操作方式与array非常相似,两者的区别在于空间运用的灵活性.array是静态空间,一旦配置了,就不能改变:要换个大(或小)一点的可以,但琐碎的事由客户端完成:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统.而vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素.它对内存的合理利用和灵活运用有很大的帮助. vector实现关键技术:对大小的控制以及重新配置时的数据移动效率

C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用.很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率.这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用. STL共有六大组件: 一.容器(Container):是一种数据结构,如list,vector,deque,queue等,以模板类的方法提供,为了访问容器中的数据,可以使用由容器类提供的迭代器. 二.迭代器(Iterator):提供了访问容器中对象的方法. 三.算法(Al