我正在尝试对一些变量进行复杂的变量校正(基于各个相位空间中的归一化)对于我正在阅读的一些数据。由于每个校正遵循相同的过程,我想知道是否无论如何都会迭代地执行此操作,而不是自己处理每个变量(因为我需要这个约18-20个变量)。 C ++可以处理这个吗?有人告诉我在python中尝试这个,但我觉得它可以用某种方式用C ++完成......我只是碰壁了!
给你一个想法,给出类似的东西:
class VariableClass{
public :
//each object of this class represents an event for this particlular data set
//containing the following variables
double x;
double y;
double z;
}
我想按照以下方式做点什么:
for (int i=0; i < num_variables; i++)
{
for (int j=0; j < num_events; j++)
{
//iterate through events
}
//correct variable here, then move on to next one
}
提前感谢任何建议!!!
答案 0 :(得分:2)
我假设您的成员变量不会都具有相同的类型。否则你可以把它们扔进一个容器里。如果您有C ++ 11,那么解决此问题的一种方法是tuple。使用一些template metaprogramming,您可以模拟元组的所有元素的循环。函数std::tie将构建一个元组,引用您可以“迭代”的所有成员,如下所示:
struct DoCorrection
{
template<typename T>
void operator()(T& t) const { /* code goes here */ }
};
for_each(std::tie(x, y, z), DoCorrection());
// see linked SO answer for the detailed code to make this special for_each work.
然后,您可以为每个成员变量类型专门化operator()
。这将使您自动进行适当的数学运算,而无需手动跟踪类型。
答案 1 :(得分:1)
是的,只需将所有变量放入容器中,例如std::vector
。
答案 2 :(得分:1)
http://en.cppreference.com/w/cpp/container/vector
我建议花些时间阅读所有std课程。有许多容器和许多用途。
答案 3 :(得分:1)
取自glm(详情为vec3.incl)
template <typename T>
GLM_FUNC_QUALIFIER typename tvec3<T>::value_type &
tvec3<T>::operator[]
(
size_type i
)
{
assert(i < this->length());
return (&x)[i];
}
这将转化为您的示例:
class VariableClass{
public :
//each object of this class represents an event for this particlular data
double x;
double y;
double z;
double & operator[](int i) {
assert(i < 3);
return (&x)[i];
}
}
VariableClass foo();
foo.x = 2.0;
std::cout << foo[0] << std::endl; // => 2.0
如果它只是关于矢量数学的话,我会推荐glm。
答案 4 :(得分:0)
一般情况下,你不能在不依赖于实现定义的东西的情况下迭代成员,比如填充或重新排序具有不同访问限定符的部分(事实上,后面没有编译器 - 但是它是允许的)。
但是,您可以使用记录类型的泛化:std::tuple
。迭代一个元组不是直截了当的,但你会发现很多代码可以做到这一点。这里最糟糕的是命名变量的丢失,你可以模仿成员。
如果您使用Boost,您可以使用Boost.Fusion's helper-macro BOOST_FUSION_ADAPT_STRUCT将结构转换为Fusion序列,然后您可以将其与Fusion算法一起使用。