我想尽可能高效地将 std::vector< std::vector< T >> 的大小调整为已知大小 (m, n),理想情况下没有任何内存复制(T 是 float 或 double )。
class Foo {
std::vector< std::vector< T > > data;
std::vector< std::vector< T > > data_norm;
std::vector< T > min_values;
std::vector< T > max_values;
void normalize();
}
数据 是动态填充的,一次一个“行”地 push_back 新数据。每个“行”保证具有相同数量的元素。所以它实际上是一个 m x n 表。
然后我在某一时刻调用了 normalize() 方法:
- 扫描数据
- 找到每个列的最小/最大值并将它们写入min_values、max_values
- 将每个元素标准化为该列的最小值/最大值并存储在data_norm
目前,我在 normalize() 方法开始时执行 data_norm = data 只是为了确保将 data_norm 分配给大小合适,没有进一步的重新分配。但这涉及复制所有内存。如果没有这个内存拷贝,有没有办法做到这一点?
我看过 this建议的帖子
std::vector<std::vector<T>> my_vec(m, std::vector<T>(n))
但是在我的情况下 my_vec 已经存在。我可以创建并分配一个 new_vec:
std::vector<std::vector<T>> new_vec(m, std::vector<T>(n));
data_norm = new_vec;
但我想这仍然会进行内存复制,实际上它会比 data_norm = data 慢,因为初始化了一个全新的 vector (new_vec)并分配,我已经有了一个大小合适的源 vector 。
我希望有一种类似调整大小的方法来做到这一点?但是如果不对每个子 vector 进行迭代和调整大小——我猜这会造成疯狂的重新分配。
最佳答案
您可以使用 vector::resize()
,它不会创建临时 vector
http://www.cplusplus.com/reference/vector/vector/resize/
// resizing vector
#include <iostream>
#include <vector>
int main ()
{
std::vector<int> myvector;
// set some initial content:
for (int i=1;i<10;i++) myvector.push_back(i);
myvector.resize(5);
myvector.resize(8,100);
myvector.resize(12);
std::cout << "myvector contains:";
for (int i=0;i<myvector.size();i++)
std::cout << ' ' << myvector[i];
std::cout << '\n';
return 0;
}
输出:
myvector contains: 1 2 3 4 5 100 100 100 0 0 0 0
关于c++ - 调整 vector 的 vector 大小以正确大小的快速方法 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33293704/