4

是否有任何库提供像vector<>这样的多维容器?

我想看到类似的东西:

TwoD<object_class_name> D2;
ThreeD<object_class_name> D3;

并且 object_class_name 可以是任何对象,而不仅仅是内置类型。

所以我可以像这样使用对象

D2[i][j]
D3[i,j,k] or D3(i,j,k)

或类似的

谢谢。

4

5 回答 5

8

如果是 c++11,一个可能的解决方案是using允许 a 的别名template

template <typename T>
using TwoD = std::vector<std::vector<T>>;

template <typename T>
using ThreeD = std::vector<std::vector<std::vector<T>>>;

用法:

TwoD<int> t2ints;
TwoD<std::string> t2strings;

ThreeD<int> t3ints;
ThreeD<std::string> t3strings;
于 2013-05-31T15:58:02.680 回答
7

boost::multi_array可以做到这一点。

二维数组示例:

boost::multi_array<float, 2> float2D(boost::extents[5][10]);
float2D[0][0] = 1.0f;

3D 数组示例:

boost::multi_array<float, 3> float3D(boost::extents[5][10][20]);
float2D[0][0][0] = 1.0f;

存储的类型可以是类或结构以及原始类型,并且使用的内存将是连续的。

于 2013-05-31T16:21:27.027 回答
2

你可以这样做:

std::vector<std::vector<someType> > TwoDVector;

或者像这样的二维数组:

someType** TwoDArrayPointer;
someType TwoDArray[size][size2];
于 2013-05-31T15:56:01.637 回答
2

我不喜欢vector<vector>,因为每一行在堆上都有自己单独分配的内存块。这会导致两个问题:

  • 与连续的二维数组相比,遍历数组的所有元素将具有非常差的缓存性能。
  • 您不能将数组传递给需要一维数组的函数。例如,很多成像库只需要一个char *用于图像数据的图像。

因此,我建议您编写自己的二维数组模板。这是一个非常简单的任务。或者您可以在 github.com/jpreiss/array2d 上使用我的公共域代码。

另请注意:您不能operator[]使用带有多个参数的函数重载。您可以重载operator()2D 索引。

于 2013-05-31T16:06:08.117 回答
1

您可以使用vector.

// Create
vector< vector<int> > vec(4, vector<int>(4));
// Write
vec[2][3] = 10;
// Read
int a = vec[2][3];
于 2013-05-31T15:57:15.197 回答