向量的初始化非常缓慢

3

我有一个向量的向量,我正在尝试按照以下方式进行初始化:

vector<vector<float> > matrix(numberOfRows, vector<float> (numberOfCols));

但是这一行持续时间约为0.89,其中numberOfRows和numberOfCols为:

const uint32_t numRows = 10000;
const uint32_t numCols = 20000;

在以下代码中初始化动态数组需要0.04秒才能执行:

float **matrix = new float*[numberOfRows];
for (size_t i = 0; i < numberOfRows; ++i)
    matrix[i] = new float[numberOfCols];

我是否做错了什么?有没有更快的方法来初始化那个向量?

编辑:

至于问题:

我使用g++-4.5测试,使用O3优化级别和默认标准。


你使用的编译器是什么?并且你是否开启了优化编译选项? - luke
你使用的是哪个版本的C++标准? - RedX
你可能会看到一些改进,通过分配一个大块而不是10000个较小的块。请注意,在32位Windows中,您将无法容纳超过两个这样的块(或三个具有特殊配置的块)。 - Cheers and hth. - Alf
1个回答

9

区别在于向量被初始化为零,而动态数组则没有。对于2亿个值,这是可以注意到的。

您可以选择延迟初始化向量行,直到您有真实值来分配它们,通过不扩展初始化中的列。


我担心延迟初始化可能会在赋值时创建瓶颈。 - systemsfault
4
如果需要,您可以为每一行调用reserve(numberOfCols)来为每一行保留空间。如果您将每一行分配给其他容器,它会自动解决这个问题。这取决于您如何使用矩阵。 - Bo Persson
谢谢Bo,你说得对,将初始化时间降低到0.05秒了。 - systemsfault
3
如果有一个构造函数可以将容量作为参数而不实际创建任何元素,那就太好了。这样就可以构建这样一个向量的向量,其中外层向量由空向量组成,每个向量都已经具有必要的容量。 - Kerrek SB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接