精华内容
下载资源
问答
  • Vector存储原理

    千次阅读 2018-05-17 23:38:43
    Vector 所有的方法都使用了 synchronized 修饰符,即:Vector 线程安全但是性能较低,适用于,适用于多线程环境。 通过源码分析,发现在 Vector 类中有一个 Object[] 类型数组, /** * The array buffer into ...

    Vector 所有的方法都使用了 synchronized 修饰符,即:Vector 线程安全但是性能较低,适用于,适用于多线程环境。

    通过源码分析,发现在 Vector 类中有一个 Object[] 类型数组,

        /**
         * The array buffer into which the components of the vector are
         * stored. The capacity of the vector is the length of this array buffer,
         * and is at least large enough to contain all the vector's elements.
         *
         * <p>Any array elements following the last element in the Vector are null.
         *
         * @serial
         */
        protected Object[] elementData;
    

    protected Object[] elementData;

    1. 表面上把数组存储到 Vector 对象中,其实底层依然是把数据存储到 Object 数组中。
    2. 该数组的元素类型是 Object 类型,即是该集合中能且只能存储任意类型的对象。
      • 该集合中只能存储对象,不能存储基本数据类型的值。
      • 在 Java5 之前,必须对基本数据类型进行手动装箱,从 Java5 开始支持自动装箱
    3. 集合类中存储的对象,实际上存储的是对象的引用,而不是对象本身。

    Vector 类的操作方法:

    增加:

    boolean add(Object e);

    // Appends the specified element to the end of this Vector
    
    将指定元素添加到此向量的末尾,等价于 addElement 方法
    

    void add(int indiex,Object element);

    // Inserts the specified element at the specified position in this Vector.
    
    在此向量的指定位置插入指定的元素
    

    boolean addAll(Collection c);

    // Appends all of the elements in the specified Collection to the end of this Vector, in the order that they are returned by the specified
    
    把 c 集合中的元素添加到当前集合对象里
    

    删除:

    Object remove(int index);

    // Removes the element at the specified position in this Vector.
    // return element that was removed
    
    删除指定索引位置的元素,并返回删除之后的元素
    

    boolean remove(Object o);

    // Removes the first occurrence of the specified element in this Vector.
    
    删除指定的元素
    

    boolean removeAll(Collection c);

    // Removes from this Vector all of its elements that are contained in the specified Collection.
    
      从此集合中移除包含在指定集合 c中的所有元素
    

    boolean retainAll(Collection c);

    // Retains only the elements in this Vector that are contained in the specified Collection.  In other words, removes from this Vector all of its elements that are not contained in the specified Collection.
    
    在此集合中仅保留在指定集合 c 中的元素
    

    void clear();

    // Removes all of the elements from this Vector.  The Vector will be empty after this call returns (unless it throws an exception)
    
    清空该集合,相当于 removeAllElements .
    

    修改:

    Object set(int index,Object element);

    // Replaces the element at the specified position in this Vector with the specified element.
    // return the element previously at the specified position.
    
    修改当前集合中指定索引位置的元素,返回被替换的旧的元素
    

    查询:

    int size();

    // Returns the number of components in this vector.
    返回当前集合中存储的元素数
    

    boolean isEmpty();

    // Tests if this vector has no components.
    判断当前集合中元素个数是否为0
    

    Object get(int index);

    // Returns the element at the specified position in this Vector.
    
    查询指定索引位置的元素
    

    Object[] toArray();

    // Returns an array containing all of the elements in this Vector in the correct order.
    
    把集合对象转换为 Object 数组
    
    展开全文
  • std::vector<int>vec{1,2,3,4,5}; 常规数组:元素储存在栈区 ...std::vector:元素一般储存在堆区 std::vector<int>vec{1,2,3,4,5}; vec作为局部变量的话存放在栈区中,作为静态变量
    std::vector<int>vec{1,2,3,4,5};
    

    常规数组:元素储存在栈区

    int arr[10]={0};//元素0和变量arr均储存在栈区
    

    动态数组:元素储存在堆区

    //变量arr储存在栈区
    int *arr=new int[10]();//arr10个元素均为0,元素在堆区
    delete []arr;
    

    std::vector:元素一般储存在堆区

    std::vector<int>vec{1,2,3,4,5};
    

    vec作为局部变量的话存放在栈区中,作为静态变量和全局变量的话则是存放在静态区中。vec的元素{1,2,3,4,5} 储存位置则要看具体实现,一般是在堆中 ,但根据Allocator(vector调用Allocator)的实现也有可能是在其他地方,比如栈或者静态区。

    使用原则:

    (1)对于小规模数据,三者均可以使用

    (2)对于大规模数据,使用动态数组或者vector

    (3)无论数据大小,优先使用vector(毕竟vector就是一个动态数组),vector元素一般在堆上,不用顾及数据量的大小,而且速度更快更安全。

    加速vector的方法:

    如果直接利用

    vec.push_back()或者vec.insert()以及vec.emplack_back()
    

    会导致过多的拷贝行为。需要实现分配内存,避免过多的动态申请和拷贝(和vector实现机制有关)。

    若已知元素的数量n,则有两种方式:

    vec.rezize(n,1)//会分配(reallocation)或者删除(destroy)内存,同时增加或减小vec的size
    //利用下标去赋值
    vec[i]=xx;
    或者事先分配内存,再插入(避免多次分配内存和拷贝)
    vec.reserve(n);//reserve分配的capacity大于等于n,reserve不会改变vec的size
    vec.push_back();
    

    若大致已知元素的数量n:

    事先分配内存,再插入(避免多次分配内存和拷贝)
    vec.reserve(n);//reserve分配的capacity大于等于n,reserve不会改变vec的size
    vec.push_back();
    

    在这里插入图片描述

    在这里插入图片描述

    参考链接
    reserve
    resize
    zhihu
    a
    b

    展开全文
  • #include “stdafx.h”#include <iostream>#include <vector>using namespace std;void GetPrimer(int n, vector<int>& vet){ for (int i = 2; i <= n; i++) { vet.push_back(i); } vector<int>::iterator ...
  • [C++]vector存储方式和自增长问题

    千次阅读 2013-06-01 17:55:42
    我们知道,顺序容器vector为了支持快速的随机访问,使用了连续的方式存放每一个元素 因为元素的连续存储的,如果要在vector中插入一个元素,假设容器已没有空间存放新的元素,那就必须要另外找一块连续的空间,将旧...

    我们知道,顺序容器vector为了支持快速的随机访问,使用了连续的方式存放每一个元素

    因为元素的连续存储的,如果要在vector中插入一个元素,假设容器已没有空间存放新的元素,那就必须要另外找一块连续的空间,将旧元素copy到新空间中,并且把新元素插入到新空间的末尾

    实际上,为了使vector实现快速的内存分配,实际分配的空间会比当前需要的空间多一些,vector预留了额外的存储区,用于存放新的元素


    比如当前vector的size为30,实际分配的空间往往会大于30,

    vector<int> v;
    for (int i=0; i!=30; ++i)
    {
    	v.push_back(i);
    
    }
    
    cout<<"size="<<v.size()<<endl;cout<<"capacity="<<v.capacity()<<endl;
    
    
    
    

    
    
    
    

    如果再往此vector中插入元素,则一开始会使用预先分配到内存,也就是不需要重新分配,这样的本质是一次分配一块较大的空间,可以节省分配和复制元素的消耗,往往性能也比较高


    正因为实现vector的时候,对此做了优化,所以我们往往更喜欢使用vector而不是list,当然,这也需要看使用的场景,list更适合在需要随机插入和删除元素的场景,如果不需要,往往使用vector更合适


    同时,vector的这种存储机制也可能会出现问题,当机器内存没有办法分配vector需要的较大的连续的存储空间时,就会导致分配失败,并且抛出一个异常,而list却不一定


    假设,内存还有100,连续的空间有10,30,50,10,如果使用vector,需要连续的空间80,则会分配失败,而使用list,则不会有这个问题,list并不要求使用连续的空间

    当然,如果vector和list需要空间120,则用哪一种方式都会导致分配失败


    这里写这么多,只是想说明并不一定vector就更适合顺序访问,list更适合随机删除/插入,有时候还需要考虑机器的内存和实际的使用场景,只有了解好了容器本身的实现机制,才能更好的使用它们

    
    
    
    
    展开全文
  • vector 存储指针

    千次阅读 2019-03-05 17:13:29
    vector 存储指针时,释放内存应该对每个元素进行 delete,然后 clear(),将容器元素清空 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;iostream&...

    当 vector 存储指针时,释放内存应该对每个元素进行 delete,然后 clear(),将容器元素清空

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <string>
    #include <set>
    #include <memory>
    #include <vector>
    #include <assert.h>
    
    using namespace std;
    
    
    
    int main()
    {
    	vector<int> number{1,3,5,7};
    	vector<int *> integer;
      transform(number.begin(), number.end(), back_inserter(integer), 
      	[](const int &x){
      		int *y = new int(x);
      		(*y)++;
      		return y;
      	});
      cout << "Value :\n";
      for (auto x : integer) {
      	cout << *x << "\n";
      }
      cout << "Pointer :\n";
      for (auto x : integer) {
      	cout << x << "\n";
      }
    
      for (auto x : integer) {
      	delete x;
      }
      integer.clear();
      cout << "size, capacity is:\n";
      //size become 0, but capacity still not change
      cout << integer.size() << " " << integer.capacity() << "\n";
      
    
      //if want release capacity, should shrink_to_fit
      integer.shrink_to_fit();//vector<int*>(integer).swap(integer);
      cout << integer.size() << " " << integer.capacity() << "\n";
    
      int *a = new int(1);
      cout << a << "\n";
      delete a;
      return 0; 
    }
    

    输出:

    Value :
    2
    4
    6
    8
    Pointer :
    0x7fae4e4026e0
    0x7fae4e402700
    0x7fae4e4026f0
    0x7fae4e402710
    size, capacity is:
    0 4
    0 0
    0x7fae4e4026e0
    
    展开全文
  • 工作那么长时间stl容器很少去存储简单类型,一般都是利用stl容器的特性,去存储复杂类型,比如:类对象、结构体.... 0x01 实例操作 class CheckInfo { public: CheckInfo(std::string _strTime, std::string ...
  • STL之二维vector存储两个数据

    千次阅读 2016-10-16 16:41:22
    typedef pair,int> PairInt; typedef vector<PairInt> VecPair; typedef vector<VecPair> VecVec;VecVec sum(2,VecPair(8)... //声明vector用pair存储两个数据 sum[gamer].insert(sum[gamer].begin()+a,make_pair(b,c))
  • 主要为大家详细介绍了C++容器vector实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 这里写自定义目录标题使用C++的vector 使用C++的vector #include <vector> 定义结构体 struct MyPoint //创建点的数据 { double x; double y; }; 使用嵌套循环生成坐标点的x,y计算输出,类似于一个乘法...
  • 文章目录图像在内存中的存储方式Mat转Vector类型Vector转Mat 图像在内存中的存储方式 Mat - 基本图像容器:Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有...
  • 然后现在来总结一下图的存储方式。 图的分类有很多,这里不再赘述。 来看一个一般的无向图:通俗地讲,一张图是由边、顶点集构成,每条边上可能还会有相应的边权(带权的),这里讲带权的。 然后想我们怎样存储...
  • 参考资料: 1.https://blog.csdn.net/luomoshusheng/article/details/48226517 2.... ... 贴两段代码防忘记: ...当存储类对象的指针时,析构和结构的过程分析: #...
  • 利用vector进行图的存储

    千次阅读 2018-03-30 09:26:57
    图的存储有多种方式,我个人比较常用的就是邻接矩阵(存储方式是用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组存储图中的边或者弧的信息),优点就是构建起来比较方便,而且我们也可以比较方便的...
  • 如上代码,循环完结后,vector存储的5个值都是4,每次改变a的值都会改变已经压入的v中的值,说明每次执行“int a = i”时都没有申请新内存,可是不是应该申请新的内存吗?菜鸟之见,求大神解答。
  • 【C++】 使用vector存储三维坐标文件

    千次阅读 2019-07-31 10:48:44
    首先把文件(.txt)里的数据以每一个数为单位导入到vector容器里面,然后创建包含结构体的vector,按顺序以每三个为一组(代表x、y、z)存储到结构体容器中。 【数据和结果】: 【测试代码】: #include &...
  • vector的内存分配方式

    千次阅读 2019-03-27 22:23:38
    )对于vector和string,只要需要更多空间,就以realloc等价的思想来增长。这个类似于realloc的操作有四个部分: 分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数...
  • #include<iostream> #include<string>...//对应下边的第三种遍历方式所创建的 void myprint(int val) { cout << val << endl; } void test01() { //创建一个vector容器,数组 v.
  • class Step ...如何在saveStep中使用vector容器保存Step数据(vector中的每个元素都是Step),unDo中调用saveStep的语句没有写上去,因为不知道怎么创建vector容器来存储自定义Step数据。 ``` ```
  • 容器的reverse函数支持手工设置vector分配空间的大小。需要注意reverse不支持回收剩余空间,也就是无法通过reverse函数减小capacity的值,当capacity的值大于等于reverse函数的参数时,程序什么也不会做,因此只能...
  • 1 代码示例 #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__) #else #define DEBUG_CLIENTBLOCK #endif #define _CRTDBG_MAP_ALLOC #include <crtdbg.h>...
  • vector存储结构体时排序和查找

    千次阅读 2018-03-19 21:58:36
    后就可以直接使用许多算法,如排序、查找等,但是当vector内部存储结构体时,这些算法就就不能直接使用了如定义结构体如下:struct mydata{ string name; float value;};只需要定义一个比较函数bool operator == ...
  • vector

    千次阅读 2019-06-24 19:49:29
    vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 前提: #include<vector> using ...
  • 向量(Vector)是一个封装了动态大小数组的顺序容器。 向量是一个能够存放任意类型的动态数组。 C++ 中 Vector 的使用 头文件 #include <vector> 需要使用 std 命名空间 using namespace std; 以下使用方法以 ...
  • vector存储对象地址在vector操作过程中发生变化在编写搜索算法存储搜索路径的时候,以为无论如何vector的所有元素的地址都不变,比如vector<int> [0] ,就想去记录这个地址,留着这个地址以后慢慢用。 结果发现...
  • 之前做某个 project 的时候没想清楚 vector 里面存储的东西是什么,开始我还以为存的是reference,今天有时间了于是就来看看到底存了什么东西。 代码如下: # include # include using namespace std; void main...
  • C++ vector的用法小结

    2020-12-31 10:24:12
    c++ vector用法 C++内置的数组支持容器的机制...Vector存储空间是连续的,list不是连续存储的。 一、 定义和初始化 vector< typeName> v1; //默认v1为空,故下面的赋值是错误的v1[0]=5; vector<typeName>v2(v1); 或v2
  • vector容器一般被用作创建动态数组,动态数组就像Python中的list结构一样,可以比普通数组拥有更丰富操作方法,下面就为大家整理了一些最常用的操作:
  • vector容器insert()函数的三种使用方式

    千次阅读 2019-09-21 23:08:19
    This effectively increases the vector size, which causes an automatic reallocation of the allocated storage space if, and only if, the new vector size surpases the current vector capacity . ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 256,357
精华内容 102,542
关键字:

vector存储方式