提问:vector模板的第二个类型参数是什么传递的?送60分

wangshuaijie 2008-12-24 10:10:23
今天在看vector源码的时候发现一个问题,我用的是vs2008 express里的vc++,在这一版里,vector模板的定义如下:
template<class _Ty,
class _Ax>
class vector
: public _Vector_val<_Ty, _Ax>
{ // varying size array of values
public:
typedef vector<_Ty, _Ax> _Myt;
typedef _Vector_val<_Ty, _Ax> _Mybase;
typedef typename _Mybase::_Alty _Alloc;
typedef _Alloc allocator_type;
typedef typename _Alloc::size_type size_type;
typedef typename _Alloc::difference_type _Dift;
typedef _Dift difference_type;
typedef typename _Alloc::pointer _Tptr;
typedef typename _Alloc::const_pointer _Ctptr;
typedef _Tptr pointer;
typedef _Ctptr const_pointer;
typedef typename _Alloc::reference _Reft;
typedef _Reft reference;
typedef typename _Alloc::const_reference const_reference;
typedef typename _Alloc::value_type value_type;
.....................

从上面我们可以看到vector这个模板实际上有两个类型参数,_Ty和_Ax,这个_Ty就是用户代码初始化vector时提供的参数,如:
vector<int> ivec;

这行代码将int传给了_Ty,这里我想问第二个参数_Ax是谁传的?通过vector的源码我能推测出这个_Ax应该就是std::allocator,但是用户代码显然没有将这个std::allocator传给_Ax,我试着把代码改成:

vector<int,std::allocator<int>> ivec;

这样也能正常编译运行,我想问一下在用户代码没有明确将std::allocator传给_Ax的情况下,这个_Ax的值是谁传的?是不是编译器自动传的啊?还是有什么我没注意到的地方?多谢
...全文
372 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangshuaijie 2008-12-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 akirya 的回复:]
一般都使用默认的参数
vector文件最开始就是
C/C++ codetemplate<class_Ty,class_Ax=allocator<_Ty>>classvector;
[/Quote]
我晕,看到了,在文件的最前面,多谢各位指点
nineforever 2008-12-24
  • 打赏
  • 举报
回复
头文件vector开头有写:

template<class _Ty,
class _Ax = allocator<_Ty> >
class vector;
xiaoyisnail 2008-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wangshuaijie 的回复:]
另外补充一句,如果是编译器传的话,我觉得这样的设计有点问题,因为这样代码就依赖编译器的特性了,谁能说说这样设计的理由是什么?
[/Quote]

只是一个有默认值的参数,没有你说的依赖编译器的特性这种问题,设置这个默认值只是为了方便程序员
wangshuaijie 2008-12-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaoyisnail 的回复:]
第二个参数有个默认值的,就是std::allocator <T>,因为是默认参数,所以你不传就默认为std::allocator <T>,这个T就是第一个模板参数,std::allocator是容器的分配器,用来进行容器的内存管理
[/Quote]
但是请看上面的源码,里面并没有写成:
template<class _Ty,
class _Ax>
class vector
: public _Vector_val<_Ty, _Ax=std::allocator<_Ty>>
......

啊,能不能具体说说这个默认参数是什么时候传的?谢谢
  • 打赏
  • 举报
回复
一般都使用默认的参数
vector文件最开始就是
template<class _Ty,
class _Ax = allocator<_Ty> >
class vector;
xiaoyisnail 2008-12-24
  • 打赏
  • 举报
回复
补充一下,当然你也可以用std::allocator来管理你自己的内存分配,它出了容器还可以用在别的地方
xiaoyisnail 2008-12-24
  • 打赏
  • 举报
回复
第二个参数有个默认值的,就是std::allocator<T>,因为是默认参数,所以你不传就默认为std::allocator<T>,这个T就是第一个模板参数,std::allocator是容器的分配器,用来进行容器的内存管理
wangshuaijie 2008-12-24
  • 打赏
  • 举报
回复
另外补充一句,如果是编译器传的话,我觉得这样的设计有点问题,因为这样代码就依赖编译器的特性了,谁能说说这样设计的理由是什么?

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧