精华内容
下载资源
问答
  • 使用vector时,读入数据很大时,会很缓慢,要预分配一下空间,像vector<float> v,可以写成v.reserve(100000),那么对于vector<vector<float>>的如何分配?求教大神
  • 假如vector中存放100个string(不是指针类型string*,而是string),那么如果vector中的一个元素重新分配空间,会不会造成整个vector重新分配空间呢?假如代码如下: vector<string> *v1 = new vector(100); v1[20]....
  • vector容器的动态分配空间

    千次阅读 2020-03-01 21:33:58
    vector容器的底层实现基于数组,里面封装了大量高效的方法,可以完美取代掉数组。整个容器的核心实际上就是动态分配内存,也...若备用空间已经用完,如果之前的空间为0,则重新分配大小为1的空间,否则将空间扩容为...

    vector容器的底层实现基于数组,里面封装了大量高效的方法,可以完美取代掉数组。整个容器的核心实际上就是动态分配内存,也是其性能优于数组的重要原因。下面重点解析它的核心函数push_back函数:

    当数组中增加一个元素x的时候,先判断是否还有备用空间;如果还有备用空间,则将当前指针的值设为x,并将当前的指针加1;若备用空间已经用完,如果之前的空间为0,则重新分配大小为1的空间,否则将空间扩容为之前的两倍,然后将旧容器中的值重新拷贝到新空间中,并重新分配起始指针和当前指针。所以使用vector需要注意的一点就是尽量不要动态给它分配空间。而且空间重新分配之后,之前的所有指针都会失效(特别要注意)

    vector扩容机制取决于编译器类型:VS2015-----1.5倍扩容;g++编译器-------2倍扩容

    具体实现:

    void push_back(const T& x) {
        if (finish != end_of_storage) { //若当前还有备用空间
          construct(finish, x); //将当前水位的值设为x
          ++finish; //提升水位
        }
        else
          insert_aux(end(), x); 
    }
    template <class T, class Alloc>
    void vector<T, Alloc>::insert_aux(iterator position, const T& x) {
      if (finish != end_of_storage) {
        construct(finish, *(finish - 1));
        ++finish;
        T x_copy = x;
        copy_backward(position, finish - 2, finish - 1);
        *position = x_copy;
      }
      else {
        const size_type old_size = size(); //获取之前数组的大小
        const size_type len = old_size != 0 ? 2 * old_size : 1; //将当前数组的容量扩大为原来的两倍
        iterator new_start = data_allocator::allocate(len); //重新分配新数组的起始迭代器
        iterator new_finish = new_start;
        __STL_TRY {
          new_finish = uninitialized_copy(start, position, new_start); //将旧数组的值重新分配给当前的新数组
          construct(new_finish, x); //将当前数组的水位的值设为x
          ++new_finish; //提升新数组的水位
          new_finish = uninitialized_copy(position, finish, new_finish); //这语句感觉可有可无,因为它根本就不会执行,position即last,而finish也是last
        }
    
    #       ifdef  __STL_USE_EXCEPTIONS 
        catch(...) { //如果重新构造的新数组出现异常,则销毁当前新创建的数组,并释放内存空间
          destroy(new_start, new_finish); 
          data_allocator::deallocate(new_start, len);
          throw;
        }
    #       endif /* __STL_USE_EXCEPTIONS */
        destroy(begin(), end()); //将旧数组的空间释放掉
        deallocate();
        start = new_start; //new_start记录新数组的起始位置
        finish = new_finish; //重新设置当前水位的指针
        end_of_storage = new_start + len; //设置新数组的容量
      }
    }

    [1]《STL源码分析》----侯捷

    [2]《STL3.0源码》

    展开全文
  • vector的resize:既分配空间,也创建了对象,会调用构造函数 vector的reserve:reserve()表示容器预留空间,但不是真正的创建对象,需要通过insert()或push_back()等操作创建对象 reserve()只修改capacity大小,不...

    vector的resize:既分配了空间,也创建了对象,会调用构造函数
    vector的reserve:reserve()表示容器预留空间,但不是真正的创建对象,需要通过insert()或push_back()等操作创建对象
    reserve()只修改capacity大小,不修改size大小,
    resize()既修改capacity大小,也修改size大小。
    因此,在只需要足够的空间而不需要生成对象时(通常是为了节约插入元素的时间),应该选择reserve方法。

    展开全文
  • 检测vector空间自动分配策略

    千次阅读 2016-04-14 21:23:14
    看过《STL源码剖析》可以知道vector空间的自动分配策略是空间加倍。 由于stl的版本比较多,针对常用的两个做下检测,vs2012与gcc 5.3.0 size():获取当前使用大小 capacity():获取当前容器大小分配100万次检测一下...

    看过《STL源码剖析》可以知道vector空间的自动分配策略是空间加倍。
    由于stl的版本比较多,针对常用的两个做下检测,vs2012与gcc 5.3.0
    size():获取当前使用大小
    capacity():获取当前容器大小

    分配100万次检测一下。
    代码

    #include <vector>
    #include <iostream>
    
    void VectorTest()
    {
        std::vector<int> vTest;
        for (int i = 0; i < 1000000; ++i)
        {
            vTest.push_back(1);
            int nSize = vTest.size();
            int nCapacity = vTest.capacity();
            if (nSize == nCapacity)
            {
                std::cout<<nSize<<"\t"<<nCapacity<<std::endl;
            }
        }
        std::cout<<std::endl;
    };

    实验结果:
    vs2012 每次新增当前空间的1/2
    这里写图片描述
    g++ 5.3.0每次新增当前空间大小,亦即是倍增的
    这里写图片描述

    展开全文
  • vector 内存分配

    千次阅读 2019-02-02 11:06:13
    vector内存增长 vector所有的内存相关问题都可以归结于它的内存增长策略。...vector有两个函数,一个是capacity(),返回对象缓冲区(vector维护的内存空间)实际申请的空间大小,另一个size(),返回...

    【转】https://blog.csdn.net/qq_30835655/article/details/60762196

    vector内存增长

    vector所有的内存相关问题都可以归结于它的内存增长策略。vector有一个特点就是:内存空间只会增长不会减少。vector有两个函数,一个是capacity(),返回对象缓冲区(vector维护的内存空间)实际申请的空间大小,另一个size(),返回当前对象缓冲区存储数据的个数。对于vector来说,capacity是永远大于等于size的,档capacity和size相等时,vector就会扩容,capacity变大。

    比如说vector最常用的push_back操作,它的整个过程是怎么一个机制呢?这个问题经常在面试中出现。

    这个问题其实很简单,在调用push_back时,若当前容量已经不能够放入心得元素(capacity=size),那么vector会重新申请一块内存,把之前的内存里的元素拷贝到新的内存当中,然后把push_back的元素拷贝到新的内存中,最后要析构原有的vector并释放原有的内存。所以说这个过程的效率是极低的,为了避免频繁的分配内存,C++每次申请内存都会成倍的增长,例如之前是4,那么重新申请后就是8,以此类推。当然不一定是成倍增长,比如在我的编译器环境下实测是0.5倍增长,之前是4,重新申请后就是6。

    内存释放

    就像前面所说的,vector的内存空间是只增加不减少的,我们常用的操作clear()和erase(),实际上只是减少了size(),清除了数据,并不会减少capacity,所以内存空间没有减少。那么如何释放内存空间呢,正确的做法是swap()操作。

    swap交换技巧实现内存释放思想:vector()使用vector的默认构造函数建立临时vector对象,再在该临时对象上调用swap成员,swap调用之后原来vector占用的空间就等于一个默认构造的对象的大小,临时对象就具有原来对象v的大小,而该临时对象随即就会被析构,从而其占用的空间也被释放。

    std::vector<T>().swap(X)
    作用相当于:
    {
    std::vector<T>  temp(X);
    temp.swap(X);
    }
    

    交换之后,temp会被析构。

    由上可见,vector虽然是动态数组,但是本质上和数组没什么区别,频繁的销毁新建,效率很低,所以正确的做法是新建vector的时候初始化一个合适的大小(笑),回到了数组的老路上。不过之后可以动态变化还是很方便,而且还有很多好用的函数。


    作者:尹小贱
    来源:CSDN
    原文:https://blog.csdn.net/qq_30835655/article/details/60762196

    展开全文
  • vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得...
  • 回收vector空间

    2017-03-04 20:07:24
    我们知道vector的增长方式,但是即使用erase函数,并不能将其空间进行回收,找到一种办法来回收vector空间vector t; for(int i = 0;i;i++) { t.push_back(i); cout; size="(); } for(int i = 49;i...
  • 容器的reverse函数支持手工设置vector分配空间的大小。需要注意reverse不支持回收剩余空间,也就是无法通过reverse函数减小capacity的值,当capacity的值大于等于reverse函数的参数时,程序什么也不会做,因此只能...
  • C++ vector内存分配机制

    千次阅读 2018-04-02 11:04:40
    vector有两个函数,一个是capacity(),返回对象缓冲区(vector维护的内存空间)实际申请的空间大小,另一个size(),返回当前对象缓冲区存储数据的个数。对于vector来说,capacity是永远大于等于size的,档capacity和...
  • vector内存分配浅析

    千次阅读 2019-05-10 14:16:39
    STL中vector的内存分配原则是分配为2倍的,为什么是2倍呢,让我们来分析一下。 其实分配内存就是在时间和空间上做一个平衡,如果每次增加的内存很少,那么在空间上浪费的就要少一点,但是时间耗费的要多。如果每次...
  • 利用vector分配动态内存

    千次阅读 2010-07-14 12:40:00
    // vectorTest.cpp : Defines the ...#include <vector> using namespace std; int ComputeSize(void); //计算需要的内存大小 int ComputeSize(void) { int nRet = 500; return nRet; } int _tmain
  • stl-vector内存分配

    千次阅读 2017-09-05 10:47:14
    vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。 vector为了防止大量分配连续内存的开销,保持一
  • vector 的内存分配问题

    2019-06-29 19:02:46
    vector 的内存分配问题 vector 有一个机制是这样的,如果新加入一个元素,让size 大于capacity,那么vector 就会重新找一块更大的地方再把数据放进去,下面进入调试: 这是原本vector首个元素的地址,这时size 和...
  • vector空间相关操作

    2019-03-31 04:51:06
    vector与动态空间增长。
  • STL vector内存分配测试笔记

    千次阅读 2016-09-14 11:20:42
    vector 初始内存默认分配一个元素的内存长度,比如使用int声明的std::vector vec,初始内存只存在四个字节,可以调用vec.reserve(1024)分配1024个...当然,系统也根据重新分配的次数进行分配优化,可以多分配空间。但
  • 我们常常会遇到需要临时动态分配数组空间的情形。如:char * buf = new char[100];_ltoa(100,buf,10);delete[] buf; 一不小心就可能忘了释放内存空间导致内存泄漏。其实我们可以利用vector的特性来实现同样的功能。...
  • // NEW.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" ... std::vector t(128,0); for (int i = 0;i;i++){ //std::vector t; for(int j =0;j;j++){ //t.push_back(j); t.at(j)=j
  • vector空间的动态增长

    千次阅读 2017-04-10 11:19:33
    vector空间动态增加大小,并不是在原空间之后的相邻地址增加新空间,因为vector空间是线性连续分配的,不能保证原空间之后有可供配置的空间。因此,对vector的任何操作,一旦引起空间的重新配置
  • 最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点。这篇文章主要说vector内存机制和效率问题。 1. vector内存增长 vector所有的内存相关问题都...vector有一个特点就是:内存空间只会增长不会
  • vector的内存分配

    2017-04-30 00:27:54
    但是,vector的一个缺点就是它的内存分配是按照2的倍数分配内存的。当当前容量对插入元素不够时,分配一块新的内存,这块内存的容量是原vector容量的2倍大小,然后复制旧内存,释放旧内存,可能多次涉及拷贝构造函数...
  • vs的vector容量分配

    千次阅读 2019-03-01 00:16:27
    想起了之前虎牙面试的时候面试官有问过容量怎么重新分配,我说是2倍,面试官说不一定。 百度了一下说在linux下也是2倍(没有实践),应该是不同环境的实现版本不一样。 下面是代码: vector&lt;int&gt; Vec...
  • vector 避免内存频繁分配释放与手动释放vector内存
  • c++ vector内存分配、内存分布堆栈

    千次阅读 2021-01-25 17:13:22
    vector内存分配、内存分布 测试程序 #include <iostream> #include <vector> #include <unistd.h> using namespace std; int main() { int x; vector<int> vint; vint.push_back(5); ...
  • 二维数组动态分配存储空间 设二维数组为ans[numRows][numRows] ans = (int **)malloc( numRows*sizeof(int *) ); for ( i = 0; i < numRows; i++ ) ans[i] = (int *)malloc( numRows*sizeof(int) ); ...
  • 在使用resize成员函数的时候会使容器的存储空间重新分配
  • STL中vector的内存分配与正确释放

    万次阅读 2014-11-03 16:07:05
    C++ STL中的vector的内存分配与释放   1.vector的内存增长 ...设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,119
精华内容 33,647
关键字:

给vector分配空间