4

我目前正在尝试对我正在读入的一些数据对一堆变量(基于在各种相空间中的归一化)进行复杂的变量校正。由于每次校正都遵循相同的过程,我想知道是否会有无论如何要迭代地执行此操作,而不是自己处理每个变量(因为我需要大约 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
}

提前感谢您的任何建议!!!

4

5 回答 5

3

我假设您的成员变量不会都具有相同的类型。否则,您可以将它们放入容器中。如果你有 C++11,你可以解决这个问题的一种方法是tuple。通过一些模板元编程,您可以模拟元组所有元素的循环。函数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()针对每个成员变量类型。这将让您自动进行适当的数学运算,而无需手动跟踪类型。

于 2013-02-25T21:01:52.193 回答
2

取自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,如果它只是关于矢量数学。

于 2013-02-25T20:42:17.023 回答
1

是的,只需将所有变量放入容器中,std::vector例如 。

于 2013-02-25T20:35:16.917 回答
1

http://en.cppreference.com/w/cpp/container/vector

我建议花一些时间阅读所有 std 类。有许多容器和许多用途。

于 2013-02-25T20:40:30.907 回答
0

一般来说,如果不依赖实现定义的东西,例如填充或对具有不同访问限定符的部分重新排序(实际上没有编译器会这样做——尽管它是允许的),你就不能迭代成员。

但是,您可以使用记录类型的泛化: a std::tuple。迭代一个元组并不简单,但你会发现很多代码可以做到这一点。这里最糟糕的是命名变量的丢失,你可以用成员来模仿。

如果您使用 Boost,您可以使用Boost.Fusion 的辅助宏BOOST_FUSION_ADAPT_STRUCT将结构转换为 Fusion 序列,然后您可以将其与 Fusion 算法一起使用。

于 2013-02-25T20:55:53.193 回答