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

标签 c++ optimization vector

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

相关文章:

c++ - Win32 : How to create a bordless popup window

C 功能优化

c++ - 多维 vector 总线错误

c++ - 在 C++ 中删除和释放 vector 内存的正确方法(防止不同的内存相关错误)

c++ - 如何在 C++ 中打印出嵌套 vector 的内容?

c++ - random_shuffle 不是真正随机的

c++ - 如何找出在 DLL 中调用了哪些函数?

java - 在保存文件之前从 StandardProtectionPolicy 获取散列密码 - 使用 Apache PDFBox

mysql - 更改模式时如何加快 MySQL 中的表重建?

c++ - 使用 boost property_tree 创建 json 数组