首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整std::向量大小的方法背后的设计原理是什么?

调整std::向量大小的方法背后的设计原理是什么?
EN

Stack Overflow用户
提问于 2013-05-15 16:02:33
回答 2查看 418关注 0票数 8

模板类vector中的许多方法对value_type对象进行const引用,例如:

代码语言:javascript
复制
void push_back (const value_type& val);

resize按值接受它的value_type参数时:

代码语言:javascript
复制
void resize (size_type n, value_type val = value_type());

作为一个非专家的C++程序员,我只能考虑这种选择的缺点(例如,如果size_of(value_type)足够大,可能会发生堆栈溢出)。因此,我想向那些对语言有更深入见解的人提出这样的问题:

这个选择背后的设计原理是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-15 16:05:36

代码语言:javascript
复制
void resize( size_type count, T value = T() );

此函数已被从C++11中删除了

C++11有两过载 of resize()

代码语言:javascript
复制
void resize( size_type count );
void resize( size_type count, const value_type& value);

很容易理解。第一个对象在调整大小时使用value_type类型的默认构造对象填充向量,第二个对象在调整大小时从该值中复制。

票数 9
EN

Stack Overflow用户

发布于 2013-05-15 16:12:59

这似乎是一个设计缺陷,它已经修复了。

引用STL缺陷679

C++98标准指定容器的一个成员函数通过值传递其参数(T),而不是通过const引用: void (size_type sz,T= T());这一事实多年来被反复讨论/辩论,甚至在C++98被批准之前也是第一次。按值传递此参数的理由是: 这样,可以保证自引用语句能够正常工作,例如: v.resize(v.size() + 1,v);但是,这个理由并不令人信服,因为push_back的签名是: push_back(const & x); push_back具有与调整大小相似的语义(追加)。push_back还必须在自引用情况下工作: v.push_back(v);//必须工作 传递T值的问题是,它可能比通过参考传递要昂贵得多。相反也是正确的,但是当它是真的时,它通常不那么戏剧化(例如,对于标量类型)。 即使有了移动语义,按值传递这个参数也是很昂贵的。例如,考虑一下vector>: 向量x(1000);std::vector v;.v.resize(v.size()+1,x); 在按值传递的情况下,x被复制一次到调整大小的参数中.然后在内部,由于代码在编译时无法通过向量的大小调整来知道,所以x通常会被复制(而不是移动)第二次从resize的参数复制到它在向量中的适当位置。 通过传递-通过-const-引用,在上面的例子中的x只需要复制一次。在这种情况下,x有一个昂贵的副本构造函数,因此可以保存的任何副本都有很大的节省。 如果我们能够有效地处理push_back,那么我们也应该能够有效地调整大小。接受引用参数的调整大小已经在CodeWarrior库中编码和发送,没有我所知道的问题的报告。 拟议决议: 更改23.3.3 deque,p2: 班长{。空洞尺寸调整(size_type sz,const & c); 更改23.3.3.3 deque.capacity,p3: 空调整大小(size_type sz,const & c);更改23.3.5列表,p2: 班级名单{ ..。空洞尺寸调整(size_type sz,const & c); 更改23.3.5.3 list.capacity,p3: 空洞尺寸调整(size_type sz,const & c); 变更23.3.6向量,p2: 类向量{ ..。空洞尺寸调整(size_type sz,const & c); 更改23.3.6.3 vector.capacity,p11: 空洞尺寸调整(size_type sz,const & c);

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16569872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档