【发布时间】:2015-10-23 02:00:35
【问题描述】:
我想尽可能高效地将 std::vector > 调整为已知大小(m,n),理想情况下不进行任何内存复制(T 是浮点数或双精度数)。
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();
}
data 是动态填充的,一次将新数据推回一个“行”。保证每个“行”具有相同数量的元素。所以它实际上是一个 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 慢,因为初始化了一个全新的向量 (new_vec)并分配,我已经有一个大小合适的源向量。
我希望有一种方法可以通过类似调整大小的方法来做到这一点?但是如果没有迭代并调整每个子向量的大小 - 我猜这会产生疯狂的重新分配。
【问题讨论】:
-
你的问题是初始化,但是在你发帖的最后,你说 my_vec 已经存在,所以这并不是真正的向量初始化,而是调整向量的大小。
-
如果效率是首要考虑因素,我会避免使用
std::vector,为m x n大小的一维数组分配内存,并提供方便的函数来访问数据。 -
@RSahu Boost 有一个类可以让这一切变得简单:boost.org/doc/libs/1_55_0/libs/multi_array/doc/user.html
标签: c++ optimization vector