请教个stl::vector::resize(size_type _Newsize, _Ty _Val)函数的问题
该函数实现如下,摘自list/vs 2005:
void resize(size_type _Newsize, _Ty _Val)
{
if (_Mysize < _Newsize)
_Insert_n(end(), _Newsize - _Mysize, _Val);
else
while (_Newsize < _Mysize)
pop_back();
}
这里为什么要是
void resize(size_type _Newsize, _Ty _Val)
而不是
void resize(size_type _Newsize, const _Ty& _Val)
其中
void _Insert_n(iterator _Where, size_type _Count, const _Ty& _Val)
[解决办法]
如果 2)中是void resize(size_type _Newsize, const _Ty& _Val),
那么 1)中可以这样写吧:
typename _Ty ty;
resize(_Newsize, ty);
所以我觉得不是为了满足1)中的语法而不使用const _Ty&。而是因为用法。
因为编写2)的人知道,使用2)的所有地方都不存在效率上的节约,比如1)处的使用,构造一个对象是必须的,所以不必用引用。
[解决办法]
看SGI STL 3.0中的实现:
void resize(size_type new_size, const T& x) {
if (new_size < size())
erase(begin() + new_size, end());
else
insert(end(), new_size - size(), x);
}
void resize(size_type new_size) { resize(new_size, T()); }
[解决办法]
就忍了吧。STL里的代码有点小毛病也很正常。
[解决办法]
毛病总会有的 ...
STL 需要考虑太多的因素,
有很多折衷的地方 ...
[解决办法]
两种方法都可以,看实现。
+
STL 需要考虑太多的因素,
有很多折衷的地方 ...
=======================
同感之,呵呵^_^,okokok
[解决办法]
是必须这么做了,因为要考虑编译器兼容的问题
比如
struct ST
{
}
void Fun(ST& st)
{
}
然后
Fun(ST());
这个在vc是可以编译过的,而且ST()的生命周期为Fun函数体
但在gcc 上是编译不过的
error: invalid initialization of non-const reference of type 'ST& ' from a temporary of type 'ST '
GCC这样用会编不过,错误就是说ST是个临时的,不能引用
所以由于上面偶说的 1) 的存在, 2) 必须传值