【问题标题】:Assign vectors by reference通过引用分配向量
【发布时间】:2018-03-12 21:33:30
【问题描述】:

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

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) 中进行分配?

【问题讨论】:

  • 这样做的目的到底是什么?如果y 的所有元素都引用ps 的元素,那么您通过这种方式获得了什么?
  • 有了这个改变,我可以在 y 上使用重载的向量类操作(我已经在我的真实代码中使用了),而我需要重载粒子类操作符来做到这一点ps.

标签: c++ reference variable-assignment


【解决方案1】:

使用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 缺少 &lt;double&gt;
  • 我对这个警告很安全,矢量不会调整大小。谢谢!
  • @RenanNobuyukiHirayama,不客气。请按答案旁边的复选标记接受
【解决方案2】:

有什么意义?

为什么不直接提供一个访问器函数来获取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; }
   // ...
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多