首页 > 编程语言 >c++ vector容器类元素初始化,resize,reserve

c++ vector容器类元素初始化,resize,reserve

时间:2023-04-22 23:15:16浏览次数:42  
标签:__ c++ start vector impl ._ reserve resize size

vector<Person> p;
//此处Person为类名,仅此一行代码,会调用p(即vector本身)的构造函数,此时p是空的,其元素的构造函数并未被调用

//
p.reserve(3);
//reserve函数预留空间,一下为源码
template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    reserve(size_type __n)
    {
      if (__n > this->max_size())
	__throw_length_error(__N("vector::reserve"));
      if (this->capacity() < __n)
	{
	  const size_type __old_size = size();
	  pointer __tmp = _M_allocate_and_copy(__n,
	    _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_start),
	    _GLIBCXX_MAKE_MOVE_IF_NOEXCEPT_ITERATOR(this->_M_impl._M_finish));
	  std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
			_M_get_Tp_allocator());
	  _M_deallocate(this->_M_impl._M_start,
			this->_M_impl._M_end_of_storage
			- this->_M_impl._M_start);
	  this->_M_impl._M_start = __tmp;
	  this->_M_impl._M_finish = __tmp + __old_size;
	  this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
	}
    }
//可以看出,reserve并未构造出元素,仅仅是预留空间,其后要通过push_back加元素,好处是不用加一次就整体搬一次家;

//

p.resize(3);
//resize用于重新划定空间,以下为源码
void
      resize(size_type __new_size)
      {
	if (__new_size > size())
	  _M_default_append(__new_size - size());
	else if (__new_size < size())
	  _M_erase_at_end(this->_M_impl._M_start + __new_size);
      }
//可以看出,resize是增添或者删除了元素的
//当增添元素时,注意,调用的是元素的默认构造函数,假如是 类类型+特殊需求构造了个带参数的构造函数,导致 默认构造函数失效 ,使程序错误;
//此时要将这些都加上,形成函数重载;

标签:__,c++,start,vector,impl,._,reserve,resize,size
From: https://www.cnblogs.com/wryyyyyyy/p/17344387.html

相关文章

  • [C++基础] 面向对象、C 与 C++ 区别篇
    [C++基础]面向对象、C与C++区别篇 一、面向对象1面向对象与面向过程的含义?1、面向对象面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理。类通过一些简单的外部接口与......
  • c++打卡训练(14)
    三色球问题:一共十二个球,红色白色都是三个,黑色有六个,摸出八个球,问有几种可能?流程图:伪代码:源代码:#include<stdio.h>intmain(){ intred,white,black; for(red=0;red<=3;red++){ for(white=0;white<=3;white++){ black=8-red-white; if(black<=6){ printf("红色:%d,......
  • 【CMU15-445 FALL 2022】Project #0 - C++ Primer
    关于参考&鸣谢课程官网CMU15445vscode/clionclang12cmake环境配置C++调试窗口显示“forstringvariable【CMU15-445数据库】bustubProject#0:Trie树实现(C++Primer)2022CMU15-445学习群——152391370前言按照课程要求,本文并不会给出实现代码,可以当做是我遇到问题的总......
  • C++课本第四章例题
    个人银行账户管理程序1#include<iostream>2#include<cmath>3usingnamespacestd;4classSavingsAccount{//储蓄账户类5private:6intid;//账号7doublebalance;//余......
  • VC++ | DLL的创建和使用
    文章目录DLL的创建和使用动态链接库概述1.新建项目1-1.新建文件1-2.生成动态链接库2.Dumpbin命令2-1.用法3.从DLL中导出函数4.参考DLL的创建和使用动态链接库概述1.新建项目1-1.新建文件新建DLL1.cpp#include"pch.h"intadd(inta,intb){ return(a+b);}intsubtract(i......
  • C++的拓扑排序实现
    template<typenameT=CString,typename_Data=CString> structUnion_node//!<节点 { Union_node():nColor(0){} std::vector<Union_node*>vecNodeSon; Tkey;//!<关键数据 _Datadata;//!<卫星数据 mutableintnColor;//0:白色节点(未发现),1:灰色节点(发现),......
  • 初学者代码训练Day5(c/c++)
    打鱼还是晒网要求中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。流程图  代码1#include<iostream>2usingnamespacestd;34intmain()5{intyear=0,month=0,day=......
  • vector动态数组库
    #include<vector>usingnamespacestd;vector<int>vec1;//定义一个空的vector,元素类型为intvector<int>vec2(10);//定义一个大小为10的vector,元素类型为int,初始值为0vector<int>vec3(10,1);//定义一个大小为10的vector,元素类型为int,初始值为1vector<int>vec4={1,2,......
  • C++恶意软件开发(五)Linux shellcoding
    什么是shellcode?Shellcode通常指的是一段用于攻击的机器码(二进制代码),可以被注入到目标计算机中并在其中执行。Shellcode的目的是利用目标系统的漏洞或弱点,以获取系统控制权或执行恶意操作。它的名称来自于它经常被注入到攻击者编写的恶意软件的shell环境中,以便让攻击者可以更......
  • C语言和C++推荐书籍
    《CPrimerPlus》(第六版)作者:StephenPrata《C和指针》(第二版)作者:KennethA.Reek《C语言程序设计》(第四版)作者:谭浩强《C++Primer》(第五版)作者:Lippman,Lajoie,andMoo《EffectiveC++》(第三版)作者:ScottMeyers《STL源码剖析》作者:侯捷《深入理解C++11:C++11新特性解析与......