在没有默认构造函数的情况下减小std :: vector的大小

Kor*_*icz 5 c++ stl

我有一个使用std::vector它的模板参数的模板类.参数可能不是默认的可构造的.我想减小矢量的大小(将其切割为给定的大小).明显

vec.resize( reduced_size );
Run Code Online (Sandbox Code Playgroud)

...不起作用,因为它需要默认的构造函数.

我当然可以:

  1. 为任何使用过的类型创建默认构造函数(这需要我在它可能不是一个好的设计选择时添加它)
  2. 将默认值传递给函数(界面的无用杂乱)
  3. 将构造方法传递给模板(也是无用的杂乱)

在写这个问题时,我注意到我可以erase从向量到结尾的元素:

vec.erase ( vec.begin() + position, vec.end() );
Run Code Online (Sandbox Code Playgroud)

...但是,我不确定这是否会如此高效resize.

有没有一种有效的方法来减少矢量的大小而没有默认的构造函数?

C++ 11解决方案是可以接受的.


编辑:似乎MSVC和GCC都实现了缩小调整大小作为擦除调用,因此这回答了我的性能问题.

asc*_*ler 2

在我的实现中,看起来我们有(经过一些简化):

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_appendv.resize(sz)但相对容易注意到v.erase(iter, v.end())__last == end()优化_GLIBCXX_MOVE3+ (end() - __last)。所以erase()很可能比resize()这里更有效率。

我希望大多数实现都是类似的故事:一些简单的if测试,然后调用一些相同的方法来在最后调用元素的析构函数。