1

同じタイプのメンバーのセットをループしたいと思います。以下は、うまくいく場合もあればうまくいかない場合もある解決策です。

#include <iostream>
#include <vector>
class Test{
   public:
      Test():xmin(0),ymin(0),xmax(0),ymax(0),acs((vector<int> (&)[4])xmin){};
      vector<int> xmin,ymin,xmax,ymax;
      vector<int> (&acs)[4];
};
int main(){
   Test t;
   t.xmin.push_back(2);
   cout << t.xmin.size() << "=!=" <<t.acs[0].size() << endl;
}

上記のテストコードは私にとってはうまくいきます。私が現在行っているより大きなプログラムでは、ietymin は t.acs[1] などと同じではないようです。上記の構成は一般的に意味がありますか、それとも完全に異なるものにする必要がありますか?

前もって感謝します、トーマス

4

3 に答える 3

2

メンバーへのポインターの配列を使用できます。この方法はおそらく最速ですが (あなたにとって重要なようです)、少しわかりにくく、メンバー変数のリストをもう一度言及する必要があります。

#include <iostream>
#include <vector>

struct Test
{
    std::vector<int> xmin,ymin,xmax,ymax;

    std::vector<int>& GetByIndex(int index)
    {
        typedef std::vector<int> Test::*ptr_to_member; // typedef makes syntax less crazy

        static const ptr_to_member pointers[4] = {
            &Test::xmin, &Test::ymin, &Test::xmax, &Test::ymax
        };

        return this->*pointers[index];
    }
};

int main(){
    Test t;
    t.xmin.push_back(2);
    std::cout << t.xmin.size() << "=!=" << t.GetByIndex(0).size() << '\n';
}

速度が必要ない場合は、スイッチを使用する非常に簡単なソリューションがあります。

std::vector<int>& GetByIndex(int index)
{
    switch (index) {
    case 0: return xmin;
    case 1: return ymin;
    case 2: return xmax;
    case 3: return ymax;
    default: abort();
    }
}
于 2012-04-23T16:49:11.260 に答える
0

Mike Seymour - その通りです - あなたの解決策は危険です。

以下を挿入してみてください:

class Test
{
    struct AllArrays
    {
        vector<int> * vec1, .... * vecN;
    };
    union 
    { 
        AllArrays _as_fields;
        vector<int> * _as_Array[];
    } _allTogether;
};

このためのペイロードには、少し長い修飾子を記述する必要があります。

Test t;
t._allTogether._as_fields.vec1
于 2012-04-23T16:17:45.180 に答える
0

これは非常に悪い習慣です。特に、パディングの詳細に依存しています。コンパイラが間にパディングなしでデータ メンバーをレイアウトするという保証はありません。配列を意味する場合は、配列を使用してください。私の2c...

于 2012-04-23T16:19:23.123 に答える