有没有有效的方法来获得一个大的向量?

时间:2012-10-18 12:13:46

标签: c++ c++11

我需要一个内部有n个元素的向量(我的意思是大小而不是向量的容量是n)但是不想在创建过程中初始化它们,因为这对我来说只不过是垃圾。有没有有效的方法来实现这一目标?

编辑:我可以想象的是使用reserve(n)并做一些黑客攻击(有人可以告诉我如何)让向量相信它有n个元素。或者我只是跳进一个cesspit并与malloc和free一起跳舞。

4 个答案:

答案 0 :(得分:6)

当构造函数使用size参数构造向量(并且未指定要复制到向量中的元素)时,元素将为值初始化。值初始化规则(8.5p7)指定原语是零初始化的。

唯一的解决方法是将基元包装在定义无操作默认构造函数的类类型中:

template<typename T>
struct A {
    A() {};
    T value;
};

std::vector<A<int>> vec(1000);

如果可以将初始化过程封装为迭代器,则可以使用迭代器构造向量:

std::vector<int> vec(it_begin, it_end);

否则我建议不要过多担心初始化的开销;它不会改变算法的复杂性(因为你无论如何都会访问每个成员,这使得它已经成为O(n))。

答案 1 :(得分:0)

您可以使用construct成员无法参与的分配器,例如简单的默认可构造类型。请注意这需要*并且您可能想要分析和/或检查生成的代码以确保它是值得的。

*:假设vector_type是使用此类分配器的std::vector的特化,则vector_type v(42); auto copy = v;会导致copy读取具有未指定值的v元素。这很容易出错。

答案 2 :(得分:-2)

使用std::vector::reserve

std::vector big_vec();
big_vec.reserve(100000);

答案 3 :(得分:-3)

 int zeros[n*size(int)/size(T)];
 vector<T> big((T*)myints, (T*)myints + n);