繁体   English   中英

调整向量矢量大小的快速方法(c ++)

[英]quick way of resizing vector of vectors to correct size (c++)

我想尽可能有效地将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新数据一行''。 每个“行”保证具有相同数量的元素。 所以它实际上是一个mxn表。

然后在某一点上我调用normalize ()方法:

  • 扫描数据
  • 找到最小/最大值为每一并将其写入到min_values,max_values
  • 将每个元素标准化为该列的最小值/最大值并存储在data_norm中

目前我在normalize ()方法的开头做data_norm = data只是为了确保data_norm被分配到正确的大小,并且没有进一步的重新分配。 但这涉及复制所有内存。 没有这个内存副本有没有办法做到这一点?

我已经看过这篇帖子了

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 )被初始化和分配,我已经有了一个正确大小的源向量。

我希望有一种方法可以使用类似调整大小的方法吗? 但是没有迭代并在每个子向量上调整大小 - 这会产生疯狂的重新分配,我猜。

你可以使用vector::resize() ,它可以在不创建临时向量的情况下完成

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

目前我在normalize()方法的开头做data_norm = data只是为了确保data_norm被分配到正确的大小,并且没有进一步的重新分配。

首先,你应该简单地设计你的程序,这样任何人都无法调整向量的大小并确保你没有调整它们的大小,然后你可以完全避免这项工作。 您可以在代码中放置一些断言,以确保在调试模式下大小永远不会改变,如果您想要更安全的话。

此外,如果你想“尽可能高效地”完成工作,那么你应该避免使用矢量向量,因为对于矩形矩阵来说,分配的次数比必要的多。

目前没有标准容器提供带有运行时边界的高效多维数组,但您可以很容易地定义一个。 这是一个非常小的例子。

template<typename T>
class vector2d {
  std::vector<T> data;
  int columns;

public:
  struct index { int r, c; };

  vector2d(index i) : data(i.r * i.c), columns(i.c) {}
  T &operator[] (index i) { return data[i.r*columns + i.c]; }
}

然后你可以写:

class Foo {
    vector2d<T> data;
    vector2d<T> data_norm;

    std::vector<T> min_values;
    std::vector<T> max_values;

    void normalize();

    Foo(int n, int m) : data({n, m}), data_norm({n, m}) {}
}

如果你想为任意数量的维度做同样的事情也可以做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM