通过引用分配向量

Assign vectors by reference

我想在 class 中创建一个 valarray 类型的向量,其中所述向量的每个元素都引用同一 class 中某个结构类型的向量的一个元素。示意性地,我有

struct particle{
   valarray<double> x(2);        //x has 2 components
};  

class SPH{
   vector<particle> ps(1000);    //ps has 1000 particles
   vector<valarray> y(1000);
   void RK4_step();
};

void SPH::RK4_step(){
   for(int a=0; a<1000; a++)
      y[a] = ps[a].x;            //HERE
}  

是否可以通过某种方式在 (HERE) 中通过引用进行赋值?

使用std::reference_wrapper

struct particle{
   valarray<double> x(2);        //x has 2 components
};

class SPH{
   vector<particle> ps(1000);    //ps has 1000 particles
   vector<std::reference_wrapper<valarray<double>>> y(1000);
   void RK4_step();
};

void SPH::RK4_step(){
   for(int a=0; a<1000; a++)
      y[a] = std::ref(ps[a].x);
}

警告。在矢量调整大小后,不能保证矢量元素在内存中占据相同的位置。 如果 ps 随时调整大小,您将丢失所有引用。在那种情况下,我建议 std::deque

有什么意义?

为什么不直接提供访问器函数来获取 valarray 元素呢?

struct particle{
   valarray<double> x(2);        //x has 2 components
};  

class SPH{
   vector<particle> ps(1000);    //ps has 1000 particles
   valarray<double>& va(size_t n) { return ps[n].x; }
   const valarray<double>& va(size_t n) const { return ps[n].x; }
   // ...
};