当前位置: 首页 > wzjs >正文

香港做鸡网站杭州网站设计公司

香港做鸡网站,杭州网站设计公司,百度合作推广,童美童程儿童编程价格1.引言 我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。 STL之vector基本操作-CSDN博客 1.刚才我提到了我的编译器版本是g 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么&#x…

1.引言

我在上面的文章中讲解了vector的基本操作,然后提出了几个问题。

STL之vector基本操作-CSDN博客

1.刚才我提到了我的编译器版本是g++ 11.4.0,而我们要讲解的是STL(标准模板库),那么二者之间的关系是什么?STL安装后我们到哪里去看源码?

2.我们引入了头文件#include<vector>

这里的vector的内容是什么?

3.vector<int> test_vector; 这中定义方式是干什么?<>的作用是什么?

4.test_vector.push_back(22); 对于stl源码底层到底做了什么?把对应的数据插入到了哪个地址了?

什么时候分配的虚拟内存?什么时候扩容?什么时候会分配物理内存?

我现在来一一解答,但是我现在不是从第一个问题讲起,而是先讲下第三个问题。

3.vector<int> test_vector; 这中定义方式是干什么?<>的作用是什么?

这样的话,我就要从类模版讲起来,因为这个是类模板的实例化,生成了一个类对象。

那么我们先从源码看起,看看类模板是怎么定义的?

2.类模板的声明

我们看下vector的定义:

看代码是继承了_Vector_base,我们今天就从_Vector_base看起,来一步步解开模版的神秘面纱。

/// See bits/stl_deque.h's _Deque_base for an explanation.template<typename _Tp, typename _Alloc>struct _Vector_base{typedef typename __gnu_cxx::__alloc_traits<_Alloc>::templaterebind<_Tp>::other _Tp_alloc_type;typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointerpointer;public:typedef _Alloc allocator_type;_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT: _M_impl(__a) { }}

 我没有把源码的定义都粘贴过来,因为代码量比较大

3. 类模板成员函数的定义

template<typename T1, typename T2>

struct _Vector_base{

}

我们知道这里进行了类模板的声明。在类模版的内部,T1和T2可以像其他任何类型一样,用于声明成员变量和成员函数。

这里要注意struct的成员默认是public的:

用这个模版类型 _Alloc 直接或者间接的 定义了三个成员变量一个成员函数。

我们先看这个

 typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointerpointer;

这里的typedef定义一个新的类型,特别注意这个typename,主要是为了声明后的是一个类型,
这个typename可以参考,模版中的typename关键字详解-CSDN博客

我们再看下后面两个:

public:typedef _Alloc allocator_type;_Vector_base(const allocator_type& __a) _GLIBCXX_NOEXCEPT: _M_impl(__a) { }

typedef就是定义新的类型,allocator_type 就是分配器类型,主要是分配内存使用:

下面是一个构造函数,直接使用这个allocator_type也就是使用了第二个模版参数类型 _Alloc。

而我们的这个例子中,_Vector_base相关的成员函数都是内联实现的,为了介绍的全面性,我们找一个成员函数,不是内联实现的来讲解下,我们抽取一个vector的reserve方法,来讲解,继续看下源码。

//vector的成员函数声明
// /usr/include/c++/11/bits/stl_vector.h
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >class vector : protected _Vector_base<_Tp, _Alloc>{public:voidreserve(size_type __n);}

我们看到reserve函数里的参数,没有用到模版参数,但是它的实现分离的时候,还是要按照正规的标准写法来写,它的实现如下所示:

// /usr/include/c++/11/bits/vector.tcc
template<typename _Tp, typename _Alloc>voidvector<_Tp, _Alloc>::reserve(size_type __n){//去掉中间代码...}

我们就可以知道如何定义一个类模版成员函数了。

在函数的开头,要写上模版的开头,

template<typename _Tp, typename _Alloc>

然后写函数返回值, void

然后写类名,也就是函数的限制符,属于哪个 类的,这里很关键,要带着模版参数。

vector<_Tp, _Alloc>::

4.类模版的使用

我们看上面的例子,已经定义了类模版,那么如何使用类模版呢?

为了使用类模版对象,你必须显示地制指定模版实参。

我们再来看下vector的定义

//vector的成员函数声明
// /usr/include/c++/11/bits/stl_vector.h
template<typename _Tp, typename _Alloc = std::allocator<_Tp> >class vector : protected _Vector_base<_Tp, _Alloc>{public:voidreserve(size_type __n);}

我们看到它需要两个模版实参,但是因为第二个模版参数有了默认值,typename _Alloc = std::allocator<_Tp>

所以我们指定一个就可以了。vector<int> test_vector;

#include<vector>
#include<iostream>
using namespace std;
int main(int argc,char *argv[]){vector<int> test_vector;test_vector.push_back(22);std::cout << test_vector.back() << std::endl;return 0;
}

这里的语法就是,vector后面要跟<>,里面放模版实参,多个实参用,分割开。当然这里的实参一般是一个类型。

今天这篇文章就讲解到这里,在下面我们会继续讲解,实例化和特化,以及全特化,偏特化等概念。

http://www.dtcms.com/wzjs/359916.html

相关文章:

  • 网站怎么做直播功能吗百度联盟点击广告赚钱
  • 公司平台建设怎么写深圳抖音seo
  • wordpress前台上传图片seo优化招聘
  • 网络架构分析优化排名推广教程网站
  • 网站一般用什么软件做市场营销案例150例
  • 网站正在建设中的网页怎么做南京seo招聘
  • 专做logo网站叫什么西安百度关键词排名服务
  • 做网站dreamwa网站推广seo设置
  • 汕头设计网站建设游戏搜索风云榜
  • 武汉做家电的团购网站手机刷网站排名软件
  • 视频教做家常菜的网站国内能用的搜索引擎
  • 做网站的项目介绍现在百度推广有用吗
  • 建设委员会网站我想做app推广怎么做
  • 网站开发项目管理文档企业培训计划方案
  • 网站建设推广公司需要哪些岗位百度登录个人中心
  • 番禺建设网站策划谷歌seo技巧
  • 南京哪里有做网站的双11销售数据
  • 客栈网站建设代码推广平台下载
  • 淘宝网站基础建设 托管引擎优化是什么意思
  • 企业网站的优势中国网站排名网
  • 如何建设网站效果好网站百度百科
  • 网站网页设计百度网盟官网
  • logo网站设计论文seo指的是什么意思
  • 网络推广包括哪些安新seo优化排名网站
  • 有个网站可以学做ppt郑州靠谱seo整站优化
  • ps做全屏网站画布要多大哈尔滨最新疫情通报
  • 青岛本地招聘网站新营销模式有哪些
  • 阿里巴巴企业邮箱登录入口优化大师最新版本
  • 怎么做各类网站线上卖护肤品营销方法
  • dede 网站地图搜索引擎网站