C++ 如何将自定义特征张量类存储到std::vector中?

C++ 如何将自定义特征张量类存储到std::vector中?,c++,eigen,container-data-type,C++,Eigen,Container Data Type,我试图创建一个std::vector(DIIS_Tensors),它包含我正在收敛的张量的几个(DIIS_num_iters)迭代 我将DIIS_张量初始化为: std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters); 向量DIIS_张量(DIIS_num_iters); 其中TensorRank4是一个自定义类,定义如下: class TensorRank4 { public: TensorRank4(size_t dim

我试图创建一个std::vector(DIIS_Tensors),它包含我正在收敛的张量的几个(DIIS_num_iters)迭代

我将DIIS_张量初始化为:

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters);
向量DIIS_张量(DIIS_num_iters); 其中TensorRank4是一个自定义类,定义如下:

class TensorRank4 {
public:
  TensorRank4(size_t dim0, size_t dim1, size_t dim2, size_t dim3) {
    dims_[0] = dim0;
    dims_[1] = dim1;
    dims_[2] = dim2;
    dims_[3] = dim3;
    data_.resize(dims_[0] * dims_[1] * dims_[2] * dims_[3]);
  }
  double& operator ()(size_t i, size_t j, size_t k, size_t l) {
    return data_(index(i, j, k, l));
  }
  const double& operator ()(size_t i, size_t j, size_t k, size_t l) const {
    return data_(index(i, j, k, l));
  }


//  std::vector<double> resizeR4TensortoVector(const TensorRank4 &t_dim4, int dim0, int dim1, int dim2, int dim3){

  void setZero() { data_.setZero();}
  void clear() {
    data_.resize(0);
    std::fill(dims_, dims_ + 4, 0); // It may not be std::fill but you get the posize_t.
  }

private:
  size_t index(size_t i, size_t j, size_t k, size_t l) const {
    return i * dims_[3] * dims_[2] * dims_[1]
         + j * dims_[3] * dims_[2]
         + k * dims_[3]
         + l;
  }
  size_t dims_[4];
  Eigen::VectorXd data_;
};
class-TensorRank4{
公众:
TensorRank4(尺寸标注0、尺寸标注1、尺寸标注2、尺寸标注3){
dims_0=dim0;
dims_[1]=dim1;
dims_U2]=dim2;
dims_U3]=dim3;
调整数据大小(尺寸[0]*尺寸[1]*尺寸[2]*尺寸[3]);
}
双运算符()(大小为i、大小为j、大小为k、大小为l){
返回数据(索引(i,j,k,l));
}
constdouble&运算符()(大小为i,大小为j,大小为k,大小为l)const{
返回数据(索引(i,j,k,l));
}
//std::vector resizeR4TensortoVector(常量TensorRank4&t_dim4、int dim0、int dim1、int dim2、int dim3){
void setZero(){data_uz.setZero();}
无效清除(){
调整数据大小(0);
std::fill(dims,dims_+4,0);//它可能不是std::fill,但是您得到了posize\t。
}
私人:
大小索引(大小索引i、大小索引j、大小索引k、大小索引l)常数{
返回i*dims_u[3]*dims_u[2]*dims_u[1]
+j*尺寸[3]*尺寸[2]
+k*暗度[3]
+l;
}
尺寸变暗[4];
特征::矢量xd数据;
};
但是,当我运行此代码时,会出现以下错误:

“TensorRank4”的初始化没有匹配的构造函数

根据一些搜索,这似乎与该类没有默认构造函数有关,但我对如何解决这个问题感到困惑。

std::vector DIIS_Tensors(DIIS_num_iters);
>正在尝试
DIIS_num_iters
类型的默认插入元素
TensorRank4

使用T的默认插入实例数构造容器

但是
TensorRank4
没有默认构造函数,不能默认插入

您可以为
TensorRank4
添加默认构造函数,或将实例传递给
vector
的构造函数

使用值为
value
的元素的计数副本构造容器

e、 g

//使用TensorRank4(1,2,3,4)的DIIS_num iters副本构造DIIS_张量
向量DIIS_张量(DIIS_num_iters,TensorRank4(1,2,3,4));
此行:

std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters);
请注意,如果为参数化的ctor提供以下默认参数,也可以使用默认ctor:

TensorRank4(size_t dim0 = val0, size_t dim1 = val1, size_t dim2 = val2, size_t dim3 = val3) {
    ...
}
std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters, TensorRank4(5,5,5,5));
或者,您可以使用如下所示的ctor在向量中显式构造副本:

TensorRank4(size_t dim0 = val0, size_t dim1 = val1, size_t dim2 = val2, size_t dim3 = val3) {
    ...
}
std::vector<TensorRank4> DIIS_Tensors(DIIS_num_iters, TensorRank4(5,5,5,5));
向量DIIS_张量(DIIS_num_iters,TensorRank4(5,5,5,5));
将花括号改为圆括号后,你的第二个建议对我很有用。干杯!@chtz感谢你的链接,行中是:std::vector v1(10,42);//10个元素,每个元素的值为42,但在我的例子中,42将是TensorRank4(dim1,dim2,dim3,dim4)。