std中vector的实现原理(标准模板动态库中矢量的实现原理)

我们实现的数据结构是为了解决在运行过程中动态的开辟空间使用(例如我们不停的输入,输入的多少我们不确定)

原理两种:

一、笨办法

我们第一次用多少空间,开辟多少空间A

我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据拷贝到B中,然后释放A,在C中写入新的数据

缺点:在于拷贝的次数太多,效率低

二、改进的办法

矢量有一个参数,里面填写预留的空间,加入我们填写的预留空间大小是B,这里是预留,并没有真正的开辟物理内存,预留的作用于如果这时候如果需要开辟空间做其他事情,开辟的空间会避开B,这样不好造成在这里的数据变成不连续

然后开辟空间写入数据A,仅占B的一点点而已,vector中的realloc提交数据后操作系统管理内存的机制会映射一个“内存页”4K的空间给你来使用,当在B中继续开辟空间填写数据D,这时候存入D的物理内存并不是真正的开辟,而是接着使用刚刚开辟的“内存页”,只有当4K空间用完,才会再次分配一个页使用

当写入的数据超过B,会重新开辟一块空间C,将B中的数据拷贝入C中,释放B

优点:拷贝次数大大减少,效率提高

std中vector的实现原理(标准模板动态库中矢量的实现原理)

时间: 2024-10-10 15:49:05

std中vector的实现原理(标准模板动态库中矢量的实现原理)的相关文章

C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)

我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定) 假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内存的管理,进一步和一些改正的理解 原理两种: 一.笨办法 我们第一次用多少空间,开辟多少空间A 我们第二次用空间,会开辟大于第一次开辟的空间B,将A里的数据复制到B中,然后释放A.在C中写入新的数据 缺点:在于拷贝的次数太多,效率低 二.改进的办法 矢量有一个參数,里面填写预留的空间,增加我们填写的

第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

新建一个Java Project :LunceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene-analyzers-3.1.0.jar    (分词器) 3) lucene-highlighter-3.1.0.jar    (高亮器) 4) lucene-memory-3.1.0.jar       (高亮器) 新建实体类:Article, 属性:id,title,content; gett

Android NDK开发及调用标准linux动态库.so文件

源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动将so文件和java应用一起打包成apk.对应:jni层c++开发 2.Cygwin:是windows平台上模拟Linux运行环境的工具,即window平台上的linux环境工具,so文件需要在linux平台上编译运行.对应:arm linux平台 3.CDT:eclipse下的C/C++开发工具,

C#调用非托管动态库中的函数方法

C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型. extern   "C"  __declspec(dllexport)  int  add( int ,  int ); int  add( int  a, int  b) { //实现这个函数returna+b; } 除声明外,

Golang调用windows下的dll动态库中的函数

Golang调用windows下的dll动态库中的函数 https://blog.csdn.net/xuduorui/article/details/78943331 原文地址:https://www.cnblogs.com/yuanjiangw/p/12196004.html

c++动态库中使用命名空间的问题

这是C++才会有的语言特性. 假如你使用一个程序库,他里面有桓霰淞拷衋bc,可是你自己也不小心定义了一个叫abc的变量,这样就会引起重定义错误.所以为了避免这样的现象,C++引入了名字空间(namespace)的概念,编敲代码库的时候最好把全部东西放在一个namespace中,比如 namespace MY { int abc; char cab; } 这样,你在外界就要通过MY::abc来訪问MY里面的abc,而假设你自己在外面定义了一个叫abc的变量,不会引起重定义的错误.直接调用abc会调

Android项目中JNI技术生成并调用.so动态库实现详解

生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配置SWIG环境,有点麻烦了,所以往往大家不采用这个途径,参照博文http://my.oschina.net/liusicong/blog/314162. 第二种方式:javah的方式则通过shell指令就可以完成整个流程,该过程大概包括以下步骤: 编写 Java 代码.我们将从编写 Java 类开始

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

C++标准模板库-STL库基本算法

原文链接:http://blog.csdn.net/wangfengwf/article/details/11580989#t9 16.4  STL库基本算法 标准C++STL库中算法组件为一个很重要的组成部分,该组件提供了大多数最常见的通用算法的实现,并且这些实现是经过很多测试试验并被公认在处理上是高效的.将这些最常见的算法通用化实现,最大的优势就是开发者在应用中不需要为具体的常见算法的实现而费神,只需要包含相应的头文件直接使用即可,不仅仅提高的软件开发的效率,同时还有助于软件重用性的提高.