我有一个使用std::vector
它的模板参数的模板类.参数可能不是默认的可构造的.我想减小矢量的大小(将其切割为给定的大小).明显
vec.resize( reduced_size );
Run Code Online (Sandbox Code Playgroud)
...不起作用,因为它需要默认的构造函数.
我当然可以:
在写这个问题时,我注意到我可以erase
从向量到结尾的元素:
vec.erase ( vec.begin() + position, vec.end() );
Run Code Online (Sandbox Code Playgroud)
...但是,我不确定这是否会如此高效resize
.
有没有一种有效的方法来减少矢量的大小而没有默认的构造函数?
C++ 11解决方案是可以接受的.
编辑:似乎MSVC和GCC都实现了缩小调整大小作为擦除调用,因此这回答了我的性能问题.
在我的实现中,看起来我们有(经过一些简化):
void std::vector<T,A>::resize(size_type __new_size)
{
if (__new_size > size())
_M_default_append(__new_size - size());
else if (__new_size < size())
_M_erase_at_end(begin() + __new_size);
}
auto std::vector<T,A>::erase(iterator __first, iterator __last) -> iterator
{
if (__first != __last)
{
if (__last != end())
_GLIBCXX_MOVE3(__last, end(), __first);
_M_erase_at_end(__first + (end() - __last));
}
return __first;
}
Run Code Online (Sandbox Code Playgroud)
_M_...
私有成员函数在哪里。您确实想要 的效果_M_erase_at_end
。我猜想编译器很难或不可能优化 的调用_M_default_append
,v.resize(sz)
但相对容易注意到v.erase(iter, v.end())
并__last == end()
优化_GLIBCXX_MOVE3
和+ (end() - __last)
。所以erase()
很可能比resize()
这里更有效率。
我希望大多数实现都是类似的故事:一些简单的if
测试,然后调用一些相同的方法来在最后调用元素的析构函数。