容器vector的一点疑问:capacity()函数不可控?

品茶 2010-07-15 01:03:03

#include "stdafx.h"
#include <vector>
#include <iostream>

using std::cout;
using std::endl;
using std::vector;

template<typename ContainersType>
void printContainersData(ContainersType containers)
{
ContainersType::iterator begin = containers.begin();
ContainersType::iterator end = containers.end();
for (; begin!=end; begin++)
{
cout<<*begin<<' ';
}
cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
//定义空Vector
vector<short>vContainers1;//vContainers1.capacity()结果为13 为什么?
//vector<short>vContainers1(4);//vContainers1.capacity()结果为19 为什么?
//vector<short>vContainers1(5);//vContainers1.capacity()结果为15 为什么?

//向Vector中输入元素
for (short index = 0; index<10; index++)
{
vContainers1.push_back(index);
}

cout<<"为空Vector赋值,结果为:\n";
cout<<"vContainers1:";
printContainersData(vContainers1);
cout<<vContainers1.capacity());//容器为空时capacity()不可控?
cout<<endl;

return 0;
}
...全文
161 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2010-07-18
  • 打赏
  • 举报
回复
去看源码吧。
ayw215 2010-07-17
  • 打赏
  • 举报
回复
这个是由stl的实现决定的。
去翻翻SGI的STL源代码看看吧
[Quote=引用 15 楼 teatimel 的回复:]

之前对STL不是很了解

现在是半懂不懂,这种情况最危险
现在想知道capacity的计算方法

因为是新问题,再加40分
[/Quote]
品茶 2010-07-17
  • 打赏
  • 举报
回复
之前对STL不是很了解

现在是半懂不懂,这种情况最危险
现在想知道capacity的计算方法

因为是新问题,再加40分
  • 打赏
  • 举报
回复
好吧,为何要可控?人家的库,capacity这东东,你认为干涉了,效率就不一定好了。
http://blog.csdn.net/do2jiang/archive/2009/10/18/4693317.aspx
yshuise 2010-07-15
  • 打赏
  • 举报
回复
6楼的方式是唯一可行的方法。书上有介绍。容量也许稍大,原因在于需要roundup
yshuise 2010-07-15
  • 打赏
  • 举报
回复
又中文版的电子档吗,发个给我。谢谢
====================
这么经典的书籍,应该买纸版,以此明志。
yshuise 2010-07-15
  • 打赏
  • 举报
回复
size()和resize()成对
reserve()和capacity()成对。
capacity()申请的内存不是可以确定的,也就是说当你指定参数的时候比如vector<int>s(3);
那么capacity()>=3;所以上面你不要关注它,同vector的实现有关。

reserve是调整容量的大小。

size是元素的个数,resize增删元素个数。
太乙 2010-07-15
  • 打赏
  • 举报
回复
再看看reserve:

177 void
178 reserve(size_type __n)
179 {
180 bool __realloc = _M_requires_reallocation(__n);
181 _Base::reserve(__n);
182 if (__n > _M_guaranteed_capacity)
183 _M_guaranteed_capacity = __n;
184 if (__realloc)
185 this->_M_invalidate_all();
186 }
太乙 2010-07-15
  • 打赏
  • 举报
回复

lz看自己编译器的实现源码吧,我的gcc上如下:

73 explicit vector(const _Allocator& __a = _Allocator())
74 : _Base(__a), _M_guaranteed_capacity(0) { }
75
76 explicit vector(size_type __n, const _Tp& __value = _Tp(),
77 const _Allocator& __a = _Allocator())
78 : _Base(__n, __value, __a), _M_guaranteed_capacity(__n) { }
79
80 template<class _InputIterator>
81 vector(_InputIterator __first, _InputIterator __last,
82 const _Allocator& __a = _Allocator())
83 : _Base(__gnu_debug::__check_valid_range(__first, __last),
84 __last, __a),
85 _M_guaranteed_capacity(0)
86 { _M_update_guaranteed_capacity(); }
87
88 vector(const vector<_Tp,_Allocator>& __x)
89 : _Base(__x), _Safe_base(), _M_guaranteed_capacity(__x.size()) { }
90
91 /// Construction from a release-mode vector
92 vector(const _Base& __x)
93 : _Base(__x), _Safe_base(), _M_guaranteed_capacity(__x.size()) { }
94
95 ~vector() { }
品茶 2010-07-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 loaden 的回复:]
出于性能上的考虑!
当然,还可以在构造函数中指定,或者resize,或者strip。
[/Quote]
能简单解释下其实现原理吗,为什么是13 19 15

[Quote=引用 1 楼 healer_kx 的回复:]
什么叫做可控呢? 这个本来也没有打算让程序员完全控制啊,你就当是它内部的策略好了。
[/Quote]
不可控只是我个人的一个说法而已,关键是我想知道那三个为什么。

[Quote=引用 2 楼 pengzhixi 的回复:]
由STL实现决定
[/Quote]
能具体点吗?

[Quote=引用 5 楼 yuhuaijun 的回复:]
《STL源码剖析》
[/Quote]
谢谢,刚下,正在看。

[Quote=引用 7 楼 yshuise 的回复:]
《exceptioal c++》 系列是最经典的书籍
[/Quote]
又中文版的电子档吗,发个给我。谢谢
Email:TeaTimel@qq.com
yshuise 2010-07-15
  • 打赏
  • 举报
回复
《exceptioal c++》 系列是最经典的书籍
yshuise 2010-07-15
  • 打赏
  • 举报
回复
vector<short> s(vContainers1);
vContainers1.swap(s);
yuhuaijun 2010-07-15
  • 打赏
  • 举报
回复
《STL源码剖析》
pengzhixi 2010-07-15
  • 打赏
  • 举报
回复
reserve你可以用它来改变capacity
老邓 2010-07-15
  • 打赏
  • 举报
回复
出于性能上的考虑!
当然,还可以在构造函数中指定,或者resize,或者strip。
pengzhixi 2010-07-15
  • 打赏
  • 举报
回复
由STL实现决定
healer_kx 2010-07-15
  • 打赏
  • 举报
回复
什么叫做可控呢? 这个本来也没有打算让程序员完全控制啊,你就当是它内部的策略好了。

64,661

社区成员

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

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