STL vector的N种构造方式

1 使用默认无参的构造函数进行构造

vector<int> intVect;

观察内存可以看到生成一个带有0个元素的vector时内存中_Myfirst _Mylast _Myend的值均为0,说明vector对象并没有在堆中分配任何存储空间,仅仅是在栈中分配了16字节存储vecotr对象元素,在这16字节中前4字节如果没猜错,应该是一个虚表指针。

Vecotr模版类有三个成员变量

_Myfirst  记录在堆分配数组的首地址

_Mylast  记录在堆中分配数组中最后一个有效数据的下一字节地址(不包含有效数据)

_Myend  记录在椎中分配数组末尾元素的下一字节地址(已经超出数组寻址有效范围)

2 使用带一个参数构造的vector对象

vector<int> intVec(5);

Vector构造对象时只有一个参数时

1:分配的堆内存空间会默认全部初始化为0,

2数组空间大小为  参数 * sizeof(元素类型) , 参数指定元素的个数

3使用带两个参数构造的vector对象

1)      第一个参数:指定元素的个数(数组大小)

2)      第二个参数:数组元素全部初始化为第二个参数的值

4 构造元素为自定义类型的vector

同基本数组类型vecotr的构造相似

1)      第一个参数:指定元素的个数(数组大小)

2)      第二个参数:数组元素全部初始化为第二个参数的值

5. C11中新加的构造方式,构造函数接受一个initialize_list参数

通过initialize_list列表中所给的数值以及数值个数分配空间

6 在堆中构造vector

在堆中生成一个vector对象,并返回vector对象在堆中的首地址赋值给一个在栈中指向vector类型的指针

注意使用new分配的vector  要使用 delete 释放  delete pIntVec

7 vector的拷贝构造

vector<int>
intVec1 = { 1, 2, 3 };

vector<int>
intVec2(intVec1);

Vector的拷贝构造是一个深拷贝,intVec2分配了同intVec1同样大小的内存空间,并把intVec1中的数值拷贝了过来

8 vector的复制运算符重载

在调用赋值运算符之前

调用赋值运算符之后

可以看到intVec2把intVec1中的有效数值全部复制了过来,那么在两个vector大小不同志的情况下又会是什么样呢?

当intvec2.capacity()> intVec2.capacity()时

调用赋值运算符之前

调用赋值运算符后

IntVec2的容量大于intVec1的容量,所以可以直接把intVec1中的数据全部复制过来,而没有必要重新分配空间再复制,提高程序性能。

_Myfirst  记录在堆中分配数组的首地址

_Mylast  记录在堆中分配数组中最后一个有效数据的下一字节地址(不包含有效数据)

_Myend  记录在椎中分配数组末尾元素的下一字节地址(已经超出数组寻址有效范围)

仔细观察会发现intVec2中的成员变量_Mylast成员变量发生了变化,因为当执行

intVec2 = intVec1 这条语句后,intVec2的状态和行为就和intVec1几无区别,此时虽然intVec2还有两个int内存空间,正是由于_Mylast作为限制,才得以使此时的intVec2的状态和行为与IntVec1相同。  也说明任何一个vector对象的数据都只有在 [_Myfirst,_Mylast) 之间才有效,不包括_Mylast

当intvec2.size()< intVec2.size()时

调用赋值运算符之前

调用赋值运算符后

当赋值运算符左边的vector对象的capacity小于右边vector对象的capacity时,左边vector对象会释放原来的空间,按运算符右边vector对象的capacity大小重新分配一块新内存空间,并把源vecotr对象的数据复制到新空间中。Vector的赋值运算同样是深拷贝(仅当capacity小于源目标时)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-28 18:43:47

STL vector的N种构造方式的相关文章

Vector 的五种遍历方式

via http://blog.csdn.net/ls306196689/article/details/35787955 方式三用时最短 方式一 for (size_t i =0; i < vec.size(); i ++) { int d = vec[i]; } 方式二 size_t len = vec.size(); for (size_t i =0; i < len; i ++) { int d = vec[i]; } 方式三   for (auto it = vec.begin();

JavaScript 五种(构造方式)继承

一.对象冒充 function Parent(username){ this.username = username; this.hello = function(){ alert(this.username); } } function Child(username,password){ //通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承 //第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象, //第二步:执行this.metho

STL vector用法介绍

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

C++ stl vector介绍

转自: STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是

STL vector

author:Donald-hu    theme:STL vector 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.v

【C++】朝花夕拾——STL vector

STL之vector篇 N久之前是拿C的数组实现过vector中的一些简单功能,什么深拷贝.增删查找之类的,以为vector的实现也就是这样了,现在想想真是...too young too naive...ORZ ====================我是分割线============================= vector属于顺序容器,它的底层实现就是基于array,所以它可以支持随机访问,但是它比array更有效率,因为它动态分配的内存空间. 动态分配的内存空间: 每当vector

STL vector使用方法介绍

介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该可以有效地使用vector容器,并且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,可以操作多种数据结构和算法的模板类和函数库.vector之所以被觉得是一个容器,是由于它可以像容器一样存放各种类型的对象

STL vector用法介绍(转)

介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通过阅读这篇文章读者应该能够有效地使用vector容器,而且应该不会再去使用C类型的动态数组了.   Vector总览 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象

STL Vector容器

STL Vector容器 Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器.        vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲).         vector尾部添加或移除元素非常快速.但是在中部或头部插入元素或移除元素比较费时        头文件:#include<vector> vector对象的默认构造 vector采用模板类实现, vector对象的默认构造形式: vector<T>