3

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

编辑:我所能想象的就是使用 reserve(n) 并做一些 hack(有人可以告诉我如何)让向量相信它有 n 个元素。或者我只是跳进污水坑,与 malloc 和 free 共舞。

4

4 回答 4

6

当您使用带有size参数的构造函数构造向量时(并且不指定要复制到向量中的元素),这些元素将被value-initialized。值初始化规则 (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) )。

于 2012-10-18T12:38:47.093 回答
0

您可以使用一个分配器,该分配器的construct成员是无操作的,例如普通的默认可构造类型。请注意这意味着什么*,您可能想要分析和/或检查生成的代码以确保它是值得的。

*:假设vector_typestd::vector使用这种分配器的特殊化,然后vector_type v(42); auto copy = v;导致读取具有未指定值copy的元素。v这很容易出错。

于 2012-10-18T12:55:12.597 回答
-2

使用std::vector::reserve

std::vector big_vec();
big_vec.reserve(100000);
于 2012-10-18T12:14:57.670 回答
-3
 int zeros[n*size(int)/size(T)];
 vector<T> big((T*)myints, (T*)myints + n);
于 2012-10-18T12:21:11.040 回答