Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何遍历类C++;_C++_Loops - Fatal编程技术网

C++ 如何遍历类C++;

C++ 如何遍历类C++;,c++,loops,C++,Loops,我目前正在尝试对我正在读取的一些数据进行一系列变量的复杂变量校正(基于在不同相空间中的标准化)。由于每次修正都遵循相同的过程,我想知道是否有必要以迭代方式进行修正,而不是单独处理每个变量(因为我需要对大约18-20个变量进行修正)。C++能处理这个吗?有人告诉我用Python尝试这个,但是我觉得它可以用C++来做…我只是撞到墙了 给你一个想法,比如: class VariableClass{ public : //each object of this class repre

我目前正在尝试对我正在读取的一些数据进行一系列变量的复杂变量校正(基于在不同相空间中的标准化)。由于每次修正都遵循相同的过程,我想知道是否有必要以迭代方式进行修正,而不是单独处理每个变量(因为我需要对大约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
}
for(int i=0;i

提前感谢您的建议

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

我建议花些时间阅读所有的性病课程。有许多容器和许多用途。

摘自(细节3.incl)

模板
GLM_FUNC_限定符typename tvec3::value_type&
tvec3::运算符[]
(
第一类
)
{
断言(ilength());
返回(&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
class变量class{
公众:
//此类的每个对象表示此特定数据的一个事件
双x;
双y;
双z;
双重运算符(&O)[](int i){
断言(i<3);
返回(&x)[i];
}
}
变量类foo();
foo.x=2.0;

std::cout一般来说,如果不依赖于实现定义的内容,例如使用不同的访问限定符填充或重新排序节,则无法迭代成员(实际上没有编译器执行更晚的操作,但这是允许的)

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


如果使用Boost,可以使用helper宏将结构转换为融合序列,然后可以将其与融合算法一起使用。

我假设您的成员变量不会都具有相同的类型。否则你可以把它们扔进一个容器里。如果你有C++11,解决这个问题的一个方法就是使用一个。使用一些,您可以在元组的所有元素上模拟循环。该函数将构建一个元组,其中包含对所有成员的引用,您可以像这样“迭代”:

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.
struct DoCorrection
{
模板
void操作符()(T&T)常量{/*代码在这里*/}
};
对于每个(std::tie(x,y,z),DoCorrection());
//请参阅linked SO answer以获取详细代码,从而使每个工作都具有特殊性。

然后,可以为每个成员变量类型专门化
运算符()。这将允许您自动进行适当的计算,而无需手动跟踪类型。

您的意思是像数组一样?这是一个有趣的问题。我有点好奇你会得到什么样的回应。我不禁想知道您是否会在识别变量类型时遇到困难。例如,在内存中查看对象的内容似乎很容易,但如何知道对象中的第一个变量是double?我期待着对这个问题的回答。所有变量都是双倍的吗?他们的号码是固定的吗?然后使用<代码> STD::数组< /C>或一个普通的旧代码>双(18)< /代码>。这里有一件事人们不提的是,不,不像一些脚本语言,没有办法枚举C++中的随机类型成员变量。操作这些值需要熟悉结构。或者
std::tuple
,如果它们有不同的类型。是的,但这里看起来不是这样的,是吗?看,我在想如何使用向量来处理这些值。。。但我究竟应该如何实施呢?也许我需要以与上述不同的方式循环我的事件和变量。但这比简单地做一个向量要复杂得多。或者我把它复杂化了,实际上,我知道了如何矢量化它。毕竟没那么难。谢谢你的建议!这是非常不安全的。您不能保证编译器不会填充数据以使其更有效地访问。您至少应该添加一个
#pragma pack(1)
或类似的东西。这就是我推荐这个库的原因。该库已经过测试。我只是把它作为std容器的替代品,以防他也需要通过
foo.x
访问。是的,你是对的,这是不安全的。
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.