C ++循环遍历结构向量
C++ looping through a vector of structure
说我有
struct S {
double A;
double B;
double C;
};
和
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
}
以上代码不是正确的代码,但我只是想演示我要计算的内容。
我要计算的是循环遍历特定元素的结构向量。这可能以一种简单的好方法吗?有人可以给我一些指示,说明如何以通用方式访问结构的成员(也许这就是我编写此函数所需要的)。
提前致谢。
您需要的是指向成员的指针:
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我一开始没注意到,但是你必须传递矢量作为参考,因为你修改其中的元素。
好吧,从硬编码向量的意义上说,它不是通用的,但让我们暂时忽略它。
你想要的是指向成员的指针:
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, &myClass::A)
您要查找的概念称为指向成员的指针。您不能使用与您编写的完全相同的语法,并且指向成员语法的指针相当丑陋且不常用。但这是基础知识。
double S::*x = &S::A;
vecS[0]->*x += vecS[i]->*x
有关详细信息,请参阅以下内容:
- http://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_pointer-to-member_access_operators
- http://en.cppreference.com/w/cpp/language/pointer
此外,与您的问题无关,但您需要声明循环变量的类型i
。目前,它是未定义的。
说我有
struct S {
double A;
double B;
double C;
};
和
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
}
以上代码不是正确的代码,但我只是想演示我要计算的内容。
我要计算的是循环遍历特定元素的结构向量。这可能以一种简单的好方法吗?有人可以给我一些指示,说明如何以通用方式访问结构的成员(也许这就是我编写此函数所需要的)。
提前致谢。
您需要的是指向成员的指针:
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我一开始没注意到,但是你必须传递矢量作为参考,因为你修改其中的元素。
好吧,从硬编码向量的意义上说,它不是通用的,但让我们暂时忽略它。
你想要的是指向成员的指针:
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, &myClass::A)
您要查找的概念称为指向成员的指针。您不能使用与您编写的完全相同的语法,并且指向成员语法的指针相当丑陋且不常用。但这是基础知识。
double S::*x = &S::A;
vecS[0]->*x += vecS[i]->*x
有关详细信息,请参阅以下内容:
- http://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_pointer-to-member_access_operators
- http://en.cppreference.com/w/cpp/language/pointer
此外,与您的问题无关,但您需要声明循环变量的类型i
。目前,它是未定义的。