【问题标题】:C++ looping through a vector of structureC ++循环遍历结构向量
【发布时间】:2015-05-21 11:24:47
【问题描述】:

说我有

 struct S {
    double A;
    double B;
    double C;
  };

   std::vector<S> vecS(10);

我正在尝试编写一个通用函数void F(std::vector&lt;S&gt; vecS,structure S.x),以便可以进行以下计算

 F(std::vector<S> vecS, structure S.x) {
        for(i=1;i<10;i++)
          vecS[0].x += vecS[i].x;  
       // note the structure does not have memeber "x"
       // I want to give that as a generic input to access A,B or C
  }

上面的代码不是正确的代码,但我只是想演示我要计算的内容。

我要计算的是循环遍历特定元素的结构向量。这可能以一种简单的好方法吗?有人可以给我一些指示如何以通用方式访问结构的成员(也许这就是我编写这个函数所需要的)。

提前致谢。

【问题讨论】:

标签: c++ pointer-to-member


【解决方案1】:

你需要的是一个指向成员的指针:

void F( std::vector<S> &vecS, double S::*ptr )
{
    for(i=1;i<10;i++)
       vecS[0].*ptr += vecS[i].*ptr;  
}

// now call for A
F( vec, &S::A );

如果您需要它与不同的类型一起使用,而不仅仅是 double 在这种情况下,请使用模板。

PS 我首先没有注意到,但是当你修改其中的元素时,你必须传递向量作为参考。

【讨论】:

    【解决方案2】:

    好吧,从硬编码向量的意义上来说,这不是通用的,但让我们暂时忽略它。

    你想要的是一个指向成员的指针:

    template <typename T, typename M>
    F(std::vector<S> vecS, M T::* member) {
            for(i=1;i<10;i++)
              vecS[0].*member += vecS[i].*member;  
    }
    

    拨打F(vec, &amp;myClass::A)

    【讨论】:

      【解决方案3】:

      您正在寻找的概念称为指向成员的指针。您不能使用您编写的确切语法,并且指向成员语法的指针相当丑陋且不常用。但这是基础知识。

      double S::*x = &S::A;
      vecS[0]->*x += vecS[i]->*x
      

      查看以下内容了解更多详情:

      另外,与您的问题无关,但您需要声明循环变量的类型i。目前,它是未定义的。

      【讨论】:

        猜你喜欢
        • 2021-06-26
        • 2012-01-22
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多