gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:22 26 4
gpt4 key购买 nike

我有一个使用模板参数的 std::vector 的模板化类。该参数可能不是默认可构造的。我想减少 vector 的大小(将其切成给定的大小)。显然

vec.resize( reduced_size );

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

我当然可以:

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

在写问题时,我注意到我可以删除 vector 中的元素直到最后:

vec.erase ( vec.begin() + position, vec.end() );

...但是,我不确定这是否与resize 一样有效。

有没有没有默认构造函数的有效方法来减小 vector 的大小?

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;
}

其中 _M_... 是私有(private)成员函数。您确实需要 _M_erase_at_end 的效果。我猜编译器很难或不可能优化 v.resize(sz) 中的 _M_default_append 调用,但在 v 中相对容易注意到.erase(iter, v.end()) __last == end() 并优化掉 _GLIBCXX_MOVE3+ (end( ) - __last)。所以 erase() 很可能比这里的 resize() 更有效。

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

关于c++ - 在没有默认构造函数的情况下减小 std::vector 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17055835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com