gpt4 book ai didi

c++ - 调整 vector 的 vector 大小以正确大小的快速方法 (c++)

转载 作者:行者123 更新时间:2023-11-30 02:35:56 24 4
gpt4 key购买 nike

我想尽可能高效地将 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_valuesmax_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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com