这有点棘手,但你可以使用模板递归来帮助你几乎完全在编译时完成分配。我知道这不完全是你想要的,但我认为这是值得的 :-)
这是代码:
#include <vector>
using namespace std;
typedef vector<vector<int> > vector2d;
template<size_t K, size_t M, size_t N>
struct v_copy {
static void copy(vector2d& v, int(&a)[M][N])
{
v[K - 1].assign(a[K - 1], a[K - 1] + N);
v_copy<K - 1, M, N>::copy(v, a);
}
};
template<size_t M, size_t N>
struct v_copy<1, M, N> {
static void copy(vector2d& v, int(&a)[M][N])
{
v[0].assign(a[0], a[0] + N);
}
};
template<size_t M, size_t N>
void copy_2d(vector2d& v, int(&a)[M][N])
{
v_copy<M, M, N>::copy(v, a);
}
int main()
{
int A[2][3] = {{0, 1, 2}, {10, 11, 12}};
vector2d vector(2);
copy_2d(vector, A);
}
在C++中,由于无法部分特化函数,因此需要一个结构体。顺便说一下,使用gcc版本4.5.0编译时,这段代码生成的汇编代码与原来的相同。
vector[1].assign(A[1], A[1] + 3);
vector[0].assign(A[0], A[0] + 3);
将其编译为不同类型的二维数组应该不难。
vector <vector <int>> a (matrix.size(), vector<int>(matrix[0].size(),0));
。但是它并没有正常工作! - Jay D