C++循环遍历结构体向量

3

假设我有

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

and

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

我正在尝试编写一个通用函数void F(std::vector<S> 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
  }

上面的代码不是正确的代码,我只是试图演示我想计算什么。

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

提前感谢。


这有点像 https://dev59.com/mnA75IYBdhLWcg3wm6Uj#3205057 - 我建议使用一个 lambda 表达式对向量进行累加,以提取您想要的成员变量。 - Partha Lal
3个回答

5

What you need is a pointer to member:

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:我一开始没有注意到,但由于你修改其中的元素,所以必须将向量作为引用传递。


1

好的,这篇文章与编程有关,需要翻译成中文。您需要使内容更加通俗易懂,但不要解释,保留HTML标签。请忽略硬编码向量的意义,你想要的是一个指向成员的指针。

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;  
}

Call as F(vec, &myClass::A)


0
你要找的概念叫做成员指针。你不能使用你所写的确切语法,成员指针语法相当丑陋,也不常用。但这是基础知识。
double S::*x = &S::A;
vecS[0]->*x += vecS[i]->*x

请参考以下内容以获取更多详细信息: 此外,和你的问题无关,但你需要声明你的循环变量i的类型。目前,它是未定义的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接