【发布时间】:2023-03-25 11:40:01
【问题描述】:
我用向量和模板制作了一个 N 维结构:
//----------------N-dimensional vector--------------------------------
template<int dim,typename T> class n_dim_vector {
public:
typedef std::vector<typename n_dim_vector<dim - 1, T>::vector> vector;
};
template<typename T> class n_dim_vector <0, T> {
public:
typedef T vector;
};
它可以用不同的维度计数进行初始化,并且是代表搜索空间的类的prt。
template<int dim, typename T> class n_dim_ssc {
private:
typename n_dim_vector<dim, T>::vector searchspace;
};
我的问题:我无法获得operator[] 正确访问searchspace 的权限,特别是返回类型。
我试过了:
template<typename V> std::vector<V>& operator[](unsigned i) {
return searchspace[i];
}
T& operator[](unsigned i) {
return searchspace[i];
}
起初,认为编译器会将typename V 派生为除最后一级之外的任何类型searchspace。这就是T& operator[](unsigned i) 的用途。
但是,唉,不要这样工作。而且我无法弄清楚它会如何
编辑别担心,我不会访问空内存,结构是初始化和填充的,只是为了清楚起见,我没有包含代码。
另外,我不打算使用单个整数来访问它,我想使用searchspace[i][j]..[k]
【问题讨论】:
-
与您的问题无关,但这是一种在内存中布置数据的可怕方式。你最终得到了无数的动态分配和间接。拥有一个连续的内存空间并以多维的方式处理它通常会好得多。
-
我不明白你在做什么。您有几个堆叠的向量,并且您想通过单个
int参数访问它。实现返回T::value_type的operator()(size_t ... I)不是更好吗? -
@KerrekSB 我只是想不出任何更好的结构,我事先不知道尺寸。欢迎推荐更好的,不胜感激
-
@TeaOverflow:这个想法是分配一次内存来保存
N1*N2* ... * Ndim值,然后通过索引i1+N1*(i2+N2*(... + idim) )访问您的条目[i1][i2] ... [idim]。例如,在 2D 中,不使用std::vector<std::vector<double> >(N1,std::vector<double>(N2)),而是使用std::vector<double>(N1*N2)。
标签: c++ templates operator-overloading