这更多的是一个教育问题,我没有试图解决的具体问题。我想了解一下会发生什么";"幕后";在以下场景中:
我们有两个int
s,w
和h
,我们需要一个0
s的矩阵(vector<vector<int>>
(。有多种方法可以做到这一点,我想知道哪一种表现最好(可能意味着哪一种拷贝最少(。
选项1:
vector<vector<int>> m;
for (int i = 0; i < h; i++)
{
m.push_back(vector<int>());
for (j = 0; j < w; j++)
m[i].push_back(0);
}
选项2:
vector<vector<int>> m;
for (int i = 0; i < h; i++)
m.push_back(vector<int>(w, 0));
选项3:
vector<vector<int>> m(h, vector<int>(w, 0));
m.push_back(vector<int>());
/m.push_back(vector<int>(w, 0));
处的临时值是否在内存中创建,然后也复制到m
中?如果是这样,使用选项1来尽量减少复制不是更好吗?(假设我们只讨论更大的数组,比如1000000 x 1000000(。备选方案3也面临同样的困境;哪个往往更快(至少在纸面上(,为什么会更快?
如果想要Matrix类的性能,首先不要使用std::vector<std::vector<T>>
。您编写了一个适当的类来封装一维std::vector<T>
。向量中的一个向量在内存中是分段的。
如今,在商业硬件上,一万亿元素的矩阵在技术上是可能的,但要初始化它,你真的非常想要多个线程。这是对你的3个例子的另一个实际反对意见。
话虽如此,对于小型实验,所有的代码都很好。