2011-04-26 40 views

回答

13

有一个明显的原因:这样的构造函数是什么样的?

所有的序列容器都有一个可以用一个整数参数调用的构造函数。该构造函数将容器的大小调整为具有指定数量的元素。

是的,您可以添加第二个参数(如bool reserve_instead_of_resize),以便能够将此构造函数用于初始大小调整和初始保留,但是我认为最终结果会令人困惑。

+0

它可以采取另一种,对于保留的大小不同的整数参数 - 除了将与冲突在“T = size_t”的情况下,初始值的不同'const T&'参数(并且在其他情况下可以与另一个可转换的情况下混淆)。 – 2011-04-26 15:42:39

+1

是的。还有一致性的问题:保留只对向量有意义,所以我们最终会为vector创建另一个构造函数。我认为所有的(或大多数)其他构造函数都可用于所有的序列容器(尽管字符串确实有一些额外的构造函数,但它也不是泛型容器)。对于它的价值,我很少使用储备。作为一种优化,它有时是有用的,但我认为,不足以保证另一个构造函数。 – 2011-04-26 15:53:51

+2

我很偶尔使用'reserve'不是作为优化,而是为了防止重新分配的语义效应 - 迭代器和指针失效以及异常的可能性。我同意这不是真的值得一个构造函数,或者更确切地说是现有构造函数的一组重复项。在最糟糕的情况下,我认为你想用不重要的内容来构建并保留,而且你害怕重新分配的成本。所以你需要构造空的,然后保留,然后插入内容。 – 2011-04-26 16:01:44

10

你可以简单地做一个函数用于创建一个保留的向量:

// make_reserved_vector 
template <typename... T> 
std::vector<T...> make_reserved_vector(size_t n) { 
    std::vector<T...> vec; 
    vec.reserve(n); 
    return vec; 
} 

和使用:

auto myvec = make_reserved_vector<int>(32768); 
+4

这是一个好主意。这解决了这个问题,但是C++库仍然有一个固有的问题:你可能不得不支付两个内存分配(第一个向量构造函数,当你不知道默认容量是什么时),然后第二个(当你预留和可能的释放和重新分配)。您的解决方案充分利用了这一点,但我认为C++委员会需要重新审视这个问题。 – rts1 2016-04-01 17:52:11

+0

@ rts1:的确,这也是我的担忧。可能会有一个'默认尺寸储备',然后我们打电话给另一个储备。可能有多个构造函数,一个取大小。 – 2016-08-21 17:07:15

+1

相当古老的q/a,但在某处我必须释放我的沮丧;)我不明白为什么在初始容量和初始大小之间进行选择时,他们会选择大小。如果我们可以选择初始容量,那么施工后可以更改尺寸而无需额外费用。就像现在一样,我要么需要一个可能不需要或者可能支付两次以获得我想要的容量的大小的矢量。 Imho反对C++的第一原则,不支付你不需要的东西。无论如何,你的函数可能是处理它的最好方法 – user463035818 2017-04-12 11:34:21

0

要创建载体,并在同一时间,指定其容量,创建具有所需容量的矢量,将其复制到您想要的元素中,并从通过复制返回的迭代器中擦除。 如果构造函数很慢,只需使用只保留内存的特殊参数编写另一个构造函数即可。

int main (int argc, char** argv) { 
    std::vector<size_t> v (10, 0); 
    size_t tmp [3] = {0, 1, 2}; 
    std::vector<size_t>::iterator i (v.begin()); 
    i = std::copy ((const size_t*)tmp, (const size_t*) &tmp [3], v.begin()); 
    v.erase (i, v.end()); 
    std::cout << "\tv capacity == " << v.capacity() << std::endl; 
} 

将输出:

V容量== 10

+0

如果元素的构造函数有副作用(或者只是慢),那么这与创建一个空向量然后保留一些容量有不同的行为。 – 2017-02-21 10:25:17

+0

如果控制器速度很慢,请在您的类中创建一个只保留内存的foo构造函数 – 2017-02-21 12:02:31

相关问题