vector初始化

动态表和C++ vector

橙三吉。 提交于 2019-12-01 17:22:50
动态表和C++ vector 最近课上刚刚学了可以根据表中元素的插入和删除动态调整表大小的动态表(dynamic table),就想看一下它有什么实际的应用,第一个想起来的就是C++的vector,直觉中它是最符合动态表特性的了(预先不需要声明大小,当然你要是想声明也没问题,动态插入和删除)。但是下面这篇文章说明了vector不算是一个完全的动态表, 因为它的内存占用随着元素的插入和删除是只增加不释放的 来源: https://blog.csdn.net/qq_30835655/article/details/60762196 最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点。这篇文章主要说vector内存机制和效率问题。 vector内存增长 vector所有的内存相关问题都可以归结于它的内存增长策略。vector有一个特点就是:内存空间只会增长不会减少。vector有两个函数,一个是capacity(),返回对象缓冲区(vector维护的内存空间)实际申请的空间大小,另一个size(),返回当前对象缓冲区存储数据的个数。对于vector来说,capacity是永远大于等于size的,档capacity和size相等时,vector就会扩容,capacity变大。 比如说vector最常用的push_back操作,它的整个过程是怎么一个机制呢

C++ Primer(一)_标准库_顺序容器

萝らか妹 提交于 2019-12-01 17:22:49
目录 顺序容器 顺序容器 选择什么容器根据业务需求, 研读STL剖析了解底层数据结构, 更加清楚各种优势劣势 零碎点 迭代器被设置为 左闭右合 带来的编程假设 begin == end,范围为空 begin != end, 至少一个元素 begin可递增至end 两大类型的容器初始化——同类型容器拷贝,迭代器范围拷贝 前者要求容器类型一致 后者只要求元素可转换 两大类型的容器赋值——=号赋值,assign赋值 前者用于列表或同类型容器 后者用于迭代器,初始化列表,(n,elem)方式;限制顺序容器 swap交换容器内容 除Array,其他容器只是交换数据结构,不涉及元素拷贝插入删除,常数时间 失效内容:除了string容器,其他的都不失效,但是已经转换了容器,而Array则是转换了值 容器之比较——任何容器都支持== !=;除 无序关联 (unordered的关联容器)外,其他都支持< > <= ……各种比较 容器的== !=由元素的==实现;其他由<实现; 然而<也足以推断==情况(交换位置多比一次即可) 顺序容器的操作 失效操作请剖析STL 以下增删改查针对绝大多数顺序容器 增—— 拷贝 emplace区别主要是可用提供 初始化器 而非元素对象 front_list有自己的insert和emplace,只支持下面的front型操作 .push_back(t) .emplace

C++容器vector

℡╲_俬逩灬. 提交于 2019-12-01 15:35:41
#include <vector> using std::vector; 1.定义和初始化 vector<int> i1; //int的对象 vector<Sales_item> i2; //Sales_item的对象 vector<vector<string>> file; //该向量的元素是vector对象,有时需要在在最后两个>中间加一个空格 初始化: vector<T> v1; 空的 vector<T> v2(v1); v2中包含所有v1的元素 vector<T> v2 = v1; 同上 vector<T> v3(5,23); 有5个元素,每个元素的值都是23 vector<T> v4{5,6,7,8,9}; 有5个元素,已赋值 vector<T> v5(10); 10个元素,默认初始化 来源: https://www.cnblogs.com/penuel/p/11691030.html

STL容器----vector与list

走远了吗. 提交于 2019-12-01 10:15:03
一、Vector向量容器    连续存储 的容器, 动态 数组,在 堆 上分配空间   底层实现: 数组   两倍容量增长:     vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。     如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。   性能:   访问:O(1) 常量时间复杂度   插入:在最后插入(空间够):很快     在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。     在中间插入(空间够):内存拷贝     在中间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。   删除: 在最后删除:很快     在中间删除:内存拷贝   适用场景:经常随机访问,且不经常对非尾节点进行插入删除。 二、Lists   动态链表,在 堆 上分配空间, 每插入一个元数都会分配空间,每删除一个元素都会释放空间 。   底层: 双向链表   性能:   访问: 随机访问性能很差,只能快速访问头尾节点。   插入:很快,一般是常数开销   删除:很快,一般是常数开销   适用场景:经常插入删除大量数据 vector与list 的区别:   1

vector部分容器操作及部分泛型算法

别说谁变了你拦得住时间么 提交于 2019-12-01 08:43:40
vector部分容器操作及部分泛型算法 #include<iostream> #include<vector> #include <algorithm> using namespace std; int main(){ vector<int> prepare1 { 10,56,87,92,31 }; //列表初始化 vector<int> prepare2 (5,88); //拷贝初始化 vector<int> prepare3; vector<int> nums; vector<int> temp; swap(prepare1, prepare2); //.swap()函数 if (prepare3.empty()) //.empty()函数 { prepare3 = prepare1; //拷贝替换(不是初始化) prepare3 = { 24,99,78,86,45 }; //替换(不是初始化) } for (int i = 0; i < prepare1.size(); i++) { // 常用: .size()函数 及 .push_back函数 nums.push_back(prepare1[i]); nums.push_back(prepare2[i]); nums.push_back(prepare3[i]); } temp.assign(nums.begin()

SGI-STL简记(六)-序列容器(bit_vector)

人盡茶涼 提交于 2019-12-01 02:03:58
stl_bvector.h : bit_vector 重声明为vector<bool, alloc>即使用alloc作为内存分配器,其为非模板类,__BVECTOR也即vector<bool, _Alloc>为模板类,若使bit_vector重声明为__BVECTOR则也可为模板类; 相比vector,其可保持一个位一个元素而不是至少一个字节一个元素;此外基本的函数和vector相同,还有其他额外的提供的接口实现; bit_vector一般被认为是非模板类; _Bit_reference:位引用类,作为位迭代器类和bit_vector类中的引用类型; 数据成员,均为unsigned int类型或指针类型(后面为了便于分析,暂且定为4字节大小): _M_p:指向缓冲区中存储该位码值所在的地址; _M_mask:当前位掩码值(事实上目前一般情况下该值始终为仅含一个1其余均为0的二进制形式下的值),也即_M_p所指向的4字节位码中相应掩码值中为1的位置即为当前引用类表示的位值; 成员函数: 构造函数初始化位码值地址和掩码值; operator bool:重载bool转换,内部实现为将位码值和掩码值按照位取与的结果; operator=:重载赋值拷贝运算符,内部实现为为拷贝参数值为true,则调整位码值为当前位码值与掩码值按位或的结果,否则为当前位码值与掩码值取反后再与其求与的结果;

SGI-STL简记(六)-序列容器(vector)

强颜欢笑 提交于 2019-12-01 02:03:37
stl_vector.h : vector:可随机访问元素的序列容器,从后插入或删除在常量时间内完成,从首部或中间则需线性时间内完成; _Vector_alloc_base:vector分配基类模板;模板参数分别为数据类型T,分配器类型_Allocator,以及一个bool标识_IsStatic(用于区分是否为标准分配器或SGI分配器); 数据成员: _M_data_allocator:分配器对象; _M_start:保存申请的缓冲区首地址(等同于容器元素的首地址); _M_finish:保存容器内容长度时的尾地址; _M_end_of_storage:保存申请的缓冲区尾地址; 成员函数: 构造函数:分配器引用allocator_type类型以初始化_M_data_allocator; get_allocator:获取分配器对象_M_data_allocator; _M_allocate:通过分配器对象_M_data_allocator分配大小为n个的元素类型大小内存空间; _M_deallocate:释放指定数据元素类型指针地址大小为n个数据元素类型大小的内存空间; 此外还提供特化版本_Vector_alloc_base<_Tp, _Allocator, true>,该分配模板基类内部不再使用分配器对象,而是直接使用simple_alloc的静态成员函数进行分配管理;

整理

牧云@^-^@ 提交于 2019-11-30 19:52:48
C++11 知识整理 对class的理解 答:首先,class 也是一种数据类型,只不过是可以由开发者自由定义的一种数据类型;可以用来封装成员变量和成员函数;支持抽象,继承,多态性;在定义数据类型的时候,private,public,也从一定程度上保证了数据的安全性 抽象性:含有纯虚函数的类被称为抽象类,用途是为派生类提供基类 多态性:对于不同对象接受相同信息时产生不同的动作。分为静态多态和动态多态,体现在两个方面,一是在编译的时候,函数重载是一个方面;二是在运行的时候,虚函数是一个方面 继承性:子类具有父类的各种属性和方法,而不必再次编写相同的代码 什么是类 答:一种将抽象转换成用于定义的类型的工具,将数据表示方法和操纵这些数据的方法组合一起整合成一个包 如何将私有成员变量取出 答:方法1:通过public中的函数,传出参数将私有成员变量取出。方法2:友元函数 *this 指针 答:经典回答,进入一个房间,能看见房间里的东西,但是整个房间看不到了,然后this指针就是时刻盯着这整个房间。this指针是类的一个自动生成,自动隐藏的私有成员。存在于类的非静态成员函数中,指向内调用函数所在的对象。全局仅有一个this指针,当一个对象被创建的时候,this指针就存放指向对象数据的首地址 类和对象的区别和联系 答:区别:(1).定义不同 ,类是现实世界或思维世界的实体在计算机的反映

Dart入门?一篇文章就够了!

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 06:05:07
近期公司准备启动新项目,经过技术团队一番调研,决定采用 Flutter 来开发第一版App,故作此文,常来回顾温习。由于项目采用敏捷开发模式,故本文主要总结和记录 Dart 常用语法,更多高级和生僻用法将在后面开发过程中不定期更新。 First of all 在我们正式接触 Dart 语法之前,需要铭记以下内容,这将会对后续 Dart 语法的学习、理解和应用有很大帮助: 万物皆 对象 , 每个对象都是一个类的实例。在 Dart 中,甚至连数字、方法和 null 都是对象,并且所有的对象都继承于 Object 类。 尽管 Dart 语言是一种强类型语言,但你在类型声明时仍然可以不指定类型,因为 Dart 可以自动进行类型推断。如在代码 var number = 5; 中, number 变量的类型就被推断为 int ,当你并不想显式地声明类型时,你可以使用特有的类型 dynamic 来标识。 Dart 语言同样支持泛型,如 List<int> 、 List<dynamic> (同 Java 中的 List<Object> )。 Dart 语言支持顶级方法(即不与类绑定的方法,如上的 main 方法),以及绑定类和实例的方法(分别对应静态方法和实例方法),而且还支持方法嵌套(同 Python 和 JS)。 同样,Dart 还支持顶级变量,以及在类中定义的变量(如静态变量和实例变量)。

vector方法

a 夏天 提交于 2019-11-29 19:38:18
借鉴网上资料,整理了vector使用的一些方法,记录下来,方便以后查阅 vector初始化 vector<int>a(10) //只定义长度 vector<int>a(10,1)//长度为10,初始值为1 vector<int>a(b); //用b向量来创建a向量,整体复制性赋值 vector<int>a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素 int b[7]={1,2,3,4,5,9,8};vector<int> a(b,b+7); //从数组中获得初值 vector对象的操作 a.assign(b.begin(), b.begin()+3);//b为向量,将b的0~2个元素构成的向量赋给a a.assign(4,2);//是a只含4个元素,且每个元素为2 a.back();//返回a的最后一个元素 a.front();//返回a的第一个元素 a[i]; //返回a的第i个元素,当且仅当a[i]存在2013-12-07 a.clear();//清空a中的元素 a.empty();//判断a是否为空,空则返回ture,不空则返回false a.pop_back();//删除a向量的最后一个元素 a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素