Реализация таблицы поиска

Я работаю над пользовательской структурой данных, и в настоящее время я нахожусь в процессе бета-тестирования: данные будут храниться в массиве, и этот массив может быть представлен в виде массива 4D, 2D и 1D. Эти три массива объявлены в объединении, поскольку оно представляет одну и ту же адресацию памяти. Вот объявление моего класса:

SomeClass.h

#ifndef SomeClass_H
#define SomeClass_H

class SomeClass {
public:
    static const unsigned V1D_SIZE;   // Single Or Linear Array Representation : Size 256 - 256 Elements
    static const unsigned V2D_SIZE;   // 2D Array [16][16]                     : Size 16  - 256 Elements
    static const unsigned V4D_SIZE;   // 4D Array [4][4][4][4]                 : Size 4   - 256 Elements

    enum Index {
        HEX_UNDER_FLOW = -0x01,
        HEX_0 = 0x00,
        HEX_1 = 0x01,
        HEX_2 = 0x02,
        HEX_3 = 0x03,
        HEX_4 = 0x04,
        HEX_5 = 0x05,
        HEX_6 = 0x06,
        HEX_7 = 0x07,
        HEX_8 = 0x08,
        HEX_9 = 0x09,
        HEX_A = 0x0A,
        HEX_B = 0x0B,
        HEX_C = 0x0C,
        HEX_D = 0x0D,
        HEX_E = 0x0E,
        HEX_F = 0x0F,
        HEX_OVER_FLOW = 0x10
    }; // Index

    // Will Be Private After Testing.
    union {
        int m_p256[256];
        int m_p16[16][16];
        int m_p4[4][4][4][4];
    };

private:
    struct CrossReference {
        Index A;
        Index B;

        CrossReference() {}
        CrossReference( const Index& A_, const Index& B_ ) : A(A_), B(B_) {}
    } typedef CR;


    // Current Not Used Only Here To Illustrate A Simple Representation - May Use Or Incorporate Later
    struct Cubes {
        unsigned box;     // 0 - 3    - w
        unsigned slice;   // 0 - 15   - z 
        unsigned row;     // 0 - 15   - y
        unsigned coloumn; // 0 - 15   - x
    } m_cubes;


    CR m_cr[256];

public: 
    SomeClass();
    ~SomeClass();

    const CR& getIndexTable() const;
    void displayIndexTable() const;

private:
    // Must Be Called In Constructor First!
    void initializeCrossReference();

}; // SomeClass

#endif // SomeClass

Мне нужно создать справочную справочную таблицу пар значений координат этой 4D-структуры, чтобы реализовать ее 1D-версию.

Чтобы проиллюстрировать обход индекса, вы можете обратиться к этим изображениям для визуального представления:

3D Visual Примечание: {x,y,z,w} на этом изображении не представляет фактический 4D-массив в памяти: это просто визуализация! В памяти четырехмерный массив будет выглядеть так: array[box][slice][row][column], и это изображение представляет 1 блок в четырехмерном массиве.

2D Visual 1D LookUp Примечание. Это изображение представляет собой двухмерное визуальное представление всех четырех блоков, описанных на верхнем изображении. Цветной текст на обоих изображениях соответствует соответствующему индексу.

Второе изображение представляет собой двухмерное представление плоской сетки этой структуры данных четырехмерного массива. Мы можем использовать это изображение, чтобы сгенерировать координаты для этой справочной таблицы.

Каждая четверть этого изображения представляет собой 1 коробку. Верхний левый (начальный) — поле 0, верхнее правое поле — 1, нижнее левое поле — 2, нижнее правое поле — 3. Каждое поле можно разбить таким же образом для каждого фрагмента. Верхний левый (начальный) срез 0, верхний правый срез 1, нижний левый срез 2, нижний правый срез 3. Затем при работе в каждом срезе обход выполняется по строке - столбец, и как только столбец = 3, мы переходим к следующей строке. Итак, после того, как мы завершили один слайс, мы должны перейти к нашему местоположению в зависимости от текущего индекса слайса. То же самое касается ящиков.

Вот несколько примеров обхода этой таблицы для генерации набора значений координат индекса в шестнадцатеричной записи:

array[2][3][0][1] our [A,B] hex value would be [0x0C, 0x05] 
array[1][1][3][3] our [A,B] hex value would be [0x03, 0x0F]

Я нахожусь в процессе разработки функции для создания этой таблицы поиска. Я сделал это вручную здесь:

void SomeClass::initializeCrossReference() {
    //////////////////////////////////
    // Upper Half Of Grid Structure //
    //////////////////////////////////  

    //  Grid Coordinates //
    // Linear Or 1D Array Representation - Mapped From type[16][16] which is a 
    // 2D Compressed Version of type[4][4][4][4] - 
    // NOTE: This does not represent 4D Space; it represents a cluster of 4 (3D Cubes). 
    // In the declaration of the class there are two multi deminsional arrays that
    // are shared in memory through a nameless union.

    //      ROW              COL          

    // BOX - 0
    // Slice - 0
    // Row - 0                              // Column Coordinates
    m_cr[0].A  = HEX_0;  m_cr[0].B = HEX_0;  // col 0
    m_cr[1].A  = HEX_0;  m_cr[1].B = HEX_1;  // col 1
    m_cr[2].A  = HEX_0;  m_cr[2].B = HEX_2;  // col 2
    m_cr[3].A  = HEX_0;  m_cr[3].B = HEX_3;  // col 3
    // Row - 1
    m_cr[4].A  = HEX_1;  m_cr[4].B = HEX_0;
    m_cr[5].A  = HEX_1;  m_cr[5].B = HEX_1;
    m_cr[6].A  = HEX_1;  m_cr[6].B = HEX_2;
    m_cr[7].A  = HEX_1;  m_cr[7].B = HEX_3;
    // Row - 2
    m_cr[8].A  = HEX_2;  m_cr[8].B  = HEX_0;
    m_cr[9].A  = HEX_2;  m_cr[9].B  = HEX_1;
    m_cr[10].A = HEX_2;  m_cr[10].B = HEX_2;
    m_cr[11].A = HEX_2;  m_cr[11].B = HEX_3;
    // Row - 3
    m_cr[12].A = HEX_3;  m_cr[12].B = HEX_0;    
    m_cr[13].A = HEX_3;  m_cr[13].B = HEX_1;
    m_cr[14].A = HEX_3;  m_cr[14].B = HEX_2;
    m_cr[15].A = HEX_3;  m_cr[15].B = HEX_3;

    // Slice - 1
    // Row - 0
    m_cr[16].A = HEX_0;  m_cr[16].B = HEX_4;
    m_cr[17].A = HEX_0;  m_cr[17].B = HEX_5;
    m_cr[18].A = HEX_0;  m_cr[18].B = HEX_6;    
    m_cr[19].A = HEX_0;  m_cr[19].B = HEX_7;
    // Row - 1
    m_cr[20].A = HEX_1;  m_cr[20].B = HEX_4;
    m_cr[21].A = HEX_1;  m_cr[21].B = HEX_5;
    m_cr[22].A = HEX_1;  m_cr[22].B = HEX_6;
    m_cr[23].A = HEX_1;  m_cr[23].B = HEX_7;
    // Row - 2;
    m_cr[24].A = HEX_2;  m_cr[24].B = HEX_4;
    m_cr[25].A = HEX_2;  m_cr[25].B = HEX_5;
    m_cr[26].A = HEX_2;  m_cr[26].B = HEX_6;
    m_cr[27].A = HEX_2;  m_cr[27].B = HEX_7;
    // Row - 3
    m_cr[28].A = HEX_3;  m_cr[28].B = HEX_4;
    m_cr[29].A = HEX_3;  m_cr[29].B = HEX_5;
    m_cr[30].A = HEX_3;  m_cr[30].B = HEX_6;
    m_cr[31].A = HEX_3;  m_cr[31].B = HEX_7;

    // Slice - 2
    // Row - 0
    m_cr[32].A = HEX_4;  m_cr[32].B = HEX_0;
    m_cr[33].A = HEX_4;  m_cr[33].B = HEX_1;
    m_cr[34].A = HEX_4;  m_cr[34].B = HEX_2;
    m_cr[35].A = HEX_4;  m_cr[35].B = HEX_3;
    // Row - 1;
    m_cr[36].A = HEX_5;  m_cr[36].B = HEX_0;
    m_cr[37].A = HEX_5;  m_cr[37].B = HEX_1;
    m_cr[38].A = HEX_5;  m_cr[38].B = HEX_2;
    m_cr[39].A = HEX_5;  m_cr[39].B = HEX_3;
    // Row - 2;
    m_cr[40].A = HEX_6;  m_cr[40].B = HEX_0;
    m_cr[41].A = HEX_6;  m_cr[41].B = HEX_1;
    m_cr[42].A = HEX_6;  m_cr[42].B = HEX_2;
    m_cr[43].A = HEX_6;  m_cr[43].B = HEX_3;
    // Row - 3
    m_cr[44].A = HEX_7;  m_cr[44].B = HEX_0;
    m_cr[45].A = HEX_7;  m_cr[45].B = HEX_1;
    m_cr[46].A = HEX_7;  m_cr[46].B = HEX_2;
    m_cr[47].A = HEX_7;  m_cr[47].B = HEX_3;

    // Slice - 3
    // Row - 0
    m_cr[48].A = HEX_4;  m_cr[48].B = HEX_4;
    m_cr[49].A = HEX_4;  m_cr[49].B = HEX_5;
    m_cr[50].A = HEX_4;  m_cr[50].B = HEX_6;
    m_cr[51].A = HEX_4;  m_cr[51].B = HEX_7;
    // Row - 1
    m_cr[52].A = HEX_5;  m_cr[52].B = HEX_4;
    m_cr[53].A = HEX_5;  m_cr[53].B = HEX_5;
    m_cr[54].A = HEX_5;  m_cr[54].B = HEX_6;
    m_cr[55].A = HEX_5;  m_cr[55].B = HEX_7;
    // Row - 2;
    m_cr[56].A = HEX_6;  m_cr[56].B = HEX_4;
    m_cr[57].A = HEX_6;  m_cr[57].B = HEX_5;
    m_cr[58].A = HEX_6;  m_cr[58].B = HEX_6;
    m_cr[59].A = HEX_6;  m_cr[59].B = HEX_7;
    // Row - 3
    m_cr[60].A = HEX_7;  m_cr[60].B = HEX_4;
    m_cr[61].A = HEX_7;  m_cr[61].B = HEX_5;
    m_cr[62].A = HEX_7;  m_cr[62].B = HEX_6;
    m_cr[63].A = HEX_7;  m_cr[63].B = HEX_7;

    // BOX - 1
    // Slice - 0
    // Row - 0
    m_cr[64].A = HEX_0;  m_cr[64].B = HEX_8;
    m_cr[65].A = HEX_0;  m_cr[65].B = HEX_9;
    m_cr[66].A = HEX_0;  m_cr[66].B = HEX_A;
    m_cr[67].A = HEX_0;  m_cr[67].B = HEX_B;
    // Row - 1
    m_cr[68].A = HEX_1;  m_cr[68].B = HEX_8;
    m_cr[69].A = HEX_1;  m_cr[69].B = HEX_9;
    m_cr[70].A = HEX_1;  m_cr[70].B = HEX_A;
    m_cr[71].A = HEX_1;  m_cr[71].B = HEX_B;
    // Row - 2
    m_cr[72].A = HEX_2;  m_cr[72].B = HEX_8;
    m_cr[73].A = HEX_2;  m_cr[73].B = HEX_9;
    m_cr[74].A = HEX_2;  m_cr[74].B = HEX_A;
    m_cr[75].A = HEX_2;  m_cr[75].B = HEX_B;
    // Row - 3
    m_cr[76].A = HEX_3;  m_cr[76].B = HEX_8;
    m_cr[77].A = HEX_3;  m_cr[77].B = HEX_9;
    m_cr[78].A = HEX_3;  m_cr[78].B = HEX_A;
    m_cr[79].A = HEX_3;  m_cr[79].B = HEX_B;

    // Slice - 1
    // Row - 0
    m_cr[80].A = HEX_0;  m_cr[80].B = HEX_C;
    m_cr[81].A = HEX_0;  m_cr[81].B = HEX_D;
    m_cr[82].A = HEX_0;  m_cr[82].B = HEX_E;
    m_cr[83].A = HEX_0;  m_cr[83].B = HEX_F;
    // Row - 1
    m_cr[84].A = HEX_1;  m_cr[84].B = HEX_C;
    m_cr[85].A = HEX_1;  m_cr[85].B = HEX_D;
    m_cr[86].A = HEX_1;  m_cr[86].B = HEX_E;
    m_cr[87].A = HEX_1;  m_cr[87].B = HEX_F;
    // Row - 2
    m_cr[88].A = HEX_2;  m_cr[88].B = HEX_C;
    m_cr[89].A = HEX_2;  m_cr[89].B = HEX_D;
    m_cr[90].A = HEX_2;  m_cr[90].B = HEX_E;
    m_cr[91].A = HEX_2;  m_cr[91].B = HEX_F;
    // Row - 3
    m_cr[92].A = HEX_3;  m_cr[92].B = HEX_C;
    m_cr[93].A = HEX_3;  m_cr[93].B = HEX_D;
    m_cr[94].A = HEX_3;  m_cr[94].B = HEX_E;
    m_cr[95].A = HEX_3;  m_cr[95].B = HEX_F;

    // Slice - 2
    // Row - 0
    m_cr[96].A = HEX_4;  m_cr[96].B = HEX_8;
    m_cr[97].A = HEX_4;  m_cr[97].B = HEX_9;
    m_cr[98].A = HEX_4;  m_cr[98].B = HEX_A;
    m_cr[99].A = HEX_4;  m_cr[99].B = HEX_B;
    // Row - 1
    m_cr[100].A = HEX_5;  m_cr[100].B = HEX_8;
    m_cr[101].A = HEX_5;  m_cr[101].B = HEX_9;
    m_cr[102].A = HEX_5;  m_cr[102].B = HEX_A;
    m_cr[103].A = HEX_5;  m_cr[103].B = HEX_B;
    // Row - 2
    m_cr[104].A = HEX_6;  m_cr[104].B = HEX_8;
    m_cr[105].A = HEX_6;  m_cr[105].B = HEX_9;
    m_cr[106].A = HEX_6;  m_cr[106].B = HEX_A;
    m_cr[107].A = HEX_6;  m_cr[107].B = HEX_B;
    // Row - 3
    m_cr[108].A = HEX_7;  m_cr[108].B = HEX_8;
    m_cr[109].A = HEX_7;  m_cr[109].B = HEX_9;
    m_cr[110].A = HEX_7;  m_cr[110].B = HEX_A;
    m_cr[111].A = HEX_7;  m_cr[111].B = HEX_B;

    // Slice - 3
    // Row - 0
    m_cr[112].A = HEX_4;  m_cr[112].B = HEX_C;
    m_cr[113].A = HEX_4;  m_cr[113].B = HEX_D;
    m_cr[114].A = HEX_4;  m_cr[114].B = HEX_E;
    m_cr[115].A = HEX_4;  m_cr[115].B = HEX_F;
    // Row - 1
    m_cr[116].A = HEX_5;  m_cr[116].B = HEX_C;
    m_cr[117].A = HEX_5;  m_cr[117].B = HEX_D;
    m_cr[118].A = HEX_5;  m_cr[118].B = HEX_E;
    m_cr[119].A = HEX_5;  m_cr[119].B = HEX_F;
    // Row - 2
    m_cr[120].A = HEX_6;  m_cr[120].B = HEX_C;
    m_cr[121].A = HEX_6;  m_cr[121].B = HEX_D;
    m_cr[122].A = HEX_6;  m_cr[122].B = HEX_E;
    m_cr[123].A = HEX_6;  m_cr[123].B = HEX_F;
    // Row - 3
    m_cr[124].A = HEX_7;  m_cr[124].B = HEX_C;
    m_cr[125].A = HEX_7;  m_cr[125].B = HEX_D;
    m_cr[126].A = HEX_7;  m_cr[126].B = HEX_E;
    m_cr[127].A = HEX_7;  m_cr[127].B = HEX_F;

    //////////////////////////////////
    // Lower Half Of Grid Structure //
    //////////////////////////////////

    // Box - 2
    // Slice - 0
    // Row - 0
    m_cr[128].A = HEX_8;  m_cr[128].B = HEX_0;  // col 0
    m_cr[129].A = HEX_8;  m_cr[129].B = HEX_1;  // col 1
    m_cr[130].A = HEX_8;  m_cr[130].B = HEX_2;  // col 2
    m_cr[131].A = HEX_8;  m_cr[131].B = HEX_3;  // col 3
    // Row - 1
    m_cr[132].A = HEX_9;  m_cr[132].B = HEX_0;
    m_cr[133].A = HEX_9;  m_cr[133].B = HEX_1;
    m_cr[134].A = HEX_9;  m_cr[134].B = HEX_2;
    m_cr[135].A = HEX_9;  m_cr[135].B = HEX_3;
    // Row - 2
    m_cr[136].A = HEX_A;  m_cr[136].B = HEX_0;
    m_cr[137].A = HEX_A;  m_cr[137].B = HEX_1;
    m_cr[138].A = HEX_A;  m_cr[138].B = HEX_2;
    m_cr[139].A = HEX_A;  m_cr[139].B = HEX_3;
    // Row - 3
    m_cr[140].A = HEX_B;  m_cr[140].B = HEX_0;
    m_cr[141].A = HEX_B;  m_cr[141].B = HEX_1;
    m_cr[142].A = HEX_B;  m_cr[142].B = HEX_2;
    m_cr[143].A = HEX_B;  m_cr[143].B = HEX_3;

    // Slice - 1
    // Row - 0
    m_cr[144].A = HEX_8;  m_cr[144].B = HEX_4;
    m_cr[145].A = HEX_8;  m_cr[145].B = HEX_5;
    m_cr[146].A = HEX_8;  m_cr[146].B = HEX_6;
    m_cr[147].A = HEX_8;  m_cr[147].B = HEX_7;
    // Row - 1
    m_cr[148].A = HEX_9;  m_cr[148].B = HEX_4;
    m_cr[149].A = HEX_9;  m_cr[149].B = HEX_5;
    m_cr[150].A = HEX_9;  m_cr[150].B = HEX_6;
    m_cr[151].A = HEX_9;  m_cr[151].B = HEX_7;
    // Row - 2;
    m_cr[152].A = HEX_A;  m_cr[152].B = HEX_4;
    m_cr[153].A = HEX_A;  m_cr[153].B = HEX_5;
    m_cr[154].A = HEX_A;  m_cr[154].B = HEX_6;
    m_cr[155].A = HEX_A;  m_cr[155].B = HEX_7;
    // Row - 3
    m_cr[156].A = HEX_B;  m_cr[156].B = HEX_4;
    m_cr[157].A = HEX_B;  m_cr[157].B = HEX_5;
    m_cr[158].A = HEX_B;  m_cr[158].B = HEX_6;
    m_cr[159].A = HEX_B;  m_cr[159].B = HEX_7;

    // Slice - 2
    // Row - 0
    m_cr[160].A = HEX_C;  m_cr[160].B = HEX_0;
    m_cr[161].A = HEX_C;  m_cr[161].B = HEX_1;
    m_cr[162].A = HEX_C;  m_cr[162].B = HEX_2;
    m_cr[163].A = HEX_C;  m_cr[163].B = HEX_3;
    // Row - 1;
    m_cr[164].A = HEX_D;  m_cr[164].B = HEX_0;
    m_cr[165].A = HEX_D;  m_cr[165].B = HEX_1;
    m_cr[166].A = HEX_D;  m_cr[166].B = HEX_2;
    m_cr[167].A = HEX_D;  m_cr[167].B = HEX_3;
    // Row - 2;
    m_cr[168].A = HEX_E;  m_cr[168].B = HEX_0;
    m_cr[169].A = HEX_E;  m_cr[169].B = HEX_1;
    m_cr[170].A = HEX_E;  m_cr[170].B = HEX_2;
    m_cr[171].A = HEX_E;  m_cr[171].B = HEX_3;
    // Row - 3
    m_cr[172].A = HEX_F;  m_cr[172].B = HEX_0;
    m_cr[173].A = HEX_F;  m_cr[173].B = HEX_1;
    m_cr[174].A = HEX_F;  m_cr[174].B = HEX_2;
    m_cr[175].A = HEX_F;  m_cr[175].B = HEX_3;

    // Slice - 3
    // Row - 0
    m_cr[176].A = HEX_C;  m_cr[176].B = HEX_4;
    m_cr[177].A = HEX_C;  m_cr[177].B = HEX_5;
    m_cr[178].A = HEX_C;  m_cr[178].B = HEX_6;
    m_cr[179].A = HEX_C;  m_cr[179].B = HEX_7;
    // Row - 1
    m_cr[180].A = HEX_D;  m_cr[180].B = HEX_4;
    m_cr[181].A = HEX_D;  m_cr[181].B = HEX_5;
    m_cr[182].A = HEX_D;  m_cr[182].B = HEX_6;
    m_cr[183].A = HEX_D;  m_cr[183].B = HEX_7;
    // Row - 2;
    m_cr[184].A = HEX_E;  m_cr[184].B = HEX_4;
    m_cr[185].A = HEX_E;  m_cr[185].B = HEX_5;
    m_cr[186].A = HEX_E;  m_cr[186].B = HEX_6;
    m_cr[187].A = HEX_E;  m_cr[187].B = HEX_7;
    // Row - 3
    m_cr[188].A = HEX_F;  m_cr[188].B = HEX_4;
    m_cr[189].A = HEX_F;  m_cr[189].B = HEX_5;
    m_cr[190].A = HEX_F;  m_cr[190].B = HEX_6;
    m_cr[191].A = HEX_F;  m_cr[191].B = HEX_7;

    // BOX - 3
    // Slice - 0
    // Row - 0
    m_cr[192].A = HEX_8;  m_cr[192].B = HEX_8;
    m_cr[193].A = HEX_8;  m_cr[193].B = HEX_9;
    m_cr[194].A = HEX_8;  m_cr[194].B = HEX_A;
    m_cr[195].A = HEX_8;  m_cr[195].B = HEX_B;
    // Row - 1
    m_cr[196].A = HEX_9;  m_cr[196].B = HEX_8;
    m_cr[197].A = HEX_9;  m_cr[197].B = HEX_9;
    m_cr[198].A = HEX_9;  m_cr[198].B = HEX_A;
    m_cr[199].A = HEX_9;  m_cr[199].B = HEX_B;
    // Row - 2
    m_cr[200].A = HEX_A;  m_cr[200].B = HEX_8;
    m_cr[201].A = HEX_A;  m_cr[201].B = HEX_9;
    m_cr[202].A = HEX_A;  m_cr[202].B = HEX_A;
    m_cr[203].A = HEX_A;  m_cr[203].B = HEX_B;
    // Row - 3
    m_cr[204].A = HEX_B;  m_cr[204].B = HEX_8;
    m_cr[205].A = HEX_B;  m_cr[205].B = HEX_9;
    m_cr[206].A = HEX_B;  m_cr[206].B = HEX_A;
    m_cr[207].A = HEX_B;  m_cr[207].B = HEX_B;

    // Slice - 1
    // Row - 0
    m_cr[208].A = HEX_8;  m_cr[208].B = HEX_C;
    m_cr[209].A = HEX_8;  m_cr[209].B = HEX_D;
    m_cr[210].A = HEX_8;  m_cr[210].B = HEX_E;
    m_cr[211].A = HEX_8;  m_cr[211].B = HEX_F;
    // Row - 1
    m_cr[212].A = HEX_9;  m_cr[212].B = HEX_C;
    m_cr[213].A = HEX_9;  m_cr[213].B = HEX_D;
    m_cr[214].A = HEX_9;  m_cr[214].B = HEX_E;
    m_cr[215].A = HEX_9;  m_cr[215].B = HEX_F;
    // Row - 2
    m_cr[216].A = HEX_A;  m_cr[216].B = HEX_C;
    m_cr[217].A = HEX_A;  m_cr[217].B = HEX_D;
    m_cr[218].A = HEX_A;  m_cr[218].B = HEX_E;
    m_cr[219].A = HEX_A;  m_cr[219].B = HEX_F;
    // Row - 3
    m_cr[220].A = HEX_B;  m_cr[220].B = HEX_C;
    m_cr[221].A = HEX_B;  m_cr[221].B = HEX_D;
    m_cr[222].A = HEX_B;  m_cr[222].B = HEX_E;
    m_cr[223].A = HEX_B;  m_cr[223].B = HEX_F;

    // Slice - 2
    // Row - 0
    m_cr[224].A = HEX_C;  m_cr[224].B = HEX_8;
    m_cr[225].A = HEX_C;  m_cr[225].B = HEX_9;
    m_cr[226].A = HEX_C;  m_cr[226].B = HEX_A;
    m_cr[227].A = HEX_C;  m_cr[227].B = HEX_B;
    // Row - 1
    m_cr[228].A = HEX_D;  m_cr[228].B = HEX_8;
    m_cr[229].A = HEX_D;  m_cr[229].B = HEX_9;
    m_cr[230].A = HEX_D;  m_cr[230].B = HEX_A;
    m_cr[231].A = HEX_D;  m_cr[231].B = HEX_B;
    // Row - 2
    m_cr[232].A = HEX_E;  m_cr[232].B = HEX_8;
    m_cr[233].A = HEX_E;  m_cr[233].B = HEX_9;
    m_cr[234].A = HEX_E;  m_cr[234].B = HEX_A;
    m_cr[235].A = HEX_E;  m_cr[235].B = HEX_B;
    // Row - 3
    m_cr[236].A = HEX_F;  m_cr[236].B = HEX_8;
    m_cr[237].A = HEX_F;  m_cr[237].B = HEX_9;
    m_cr[238].A = HEX_F;  m_cr[238].B = HEX_A;
    m_cr[239].A = HEX_F;  m_cr[239].B = HEX_B;

    // Slice - 3
    // Row - 0
    m_cr[240].A = HEX_C;  m_cr[240].B = HEX_C;
    m_cr[241].A = HEX_C;  m_cr[241].B = HEX_D;
    m_cr[242].A = HEX_C;  m_cr[242].B = HEX_E;
    m_cr[243].A = HEX_C;  m_cr[243].B = HEX_F;
    // Row - 1
    m_cr[244].A = HEX_D;  m_cr[244].B = HEX_C;
    m_cr[245].A = HEX_D;  m_cr[245].B = HEX_D;
    m_cr[246].A = HEX_D;  m_cr[246].B = HEX_E;
    m_cr[247].A = HEX_D;  m_cr[247].B = HEX_F;
    // Row - 2
    m_cr[248].A = HEX_E;  m_cr[248].B = HEX_C;
    m_cr[249].A = HEX_E;  m_cr[249].B = HEX_D;
    m_cr[250].A = HEX_E;  m_cr[250].B = HEX_E;
    m_cr[251].A = HEX_E;  m_cr[251].B = HEX_F;
    // Row - 3
    m_cr[252].A = HEX_F;  m_cr[252].B = HEX_C;
    m_cr[253].A = HEX_F;  m_cr[253].B = HEX_D;
    m_cr[254].A = HEX_F;  m_cr[254].B = HEX_E;
    m_cr[255].A = HEX_F;  m_cr[255].B = HEX_F;

} // initializeCrossReference

Как видите, эта функция длинная и не очень читаемая. Я пытаюсь найти способ элегантно реализовать эту функцию, и именно здесь я застрял. Как мне сгенерировать этот шаблон в нескольких строках кода, используя цикл for и несколько операторов if (при необходимости)?

В конце концов я хотел бы сжать эти координаты [A, B] в один символ без знака, как если бы [A, B] = [0x0C, 0x08], он был бы сохранен как 0xC8 как байт вместо пары перечислений.

EDIT — добавление нового изображения, которое должно помочь понять, как я генерирую свои пары координат и точный порядок, в котором они должны быть в моем массиве поиска.

Улучшенное изображение

Примечание. Этот вопрос является сообщением, которое я принимаю, а старый вопрос здесь Пользовательская структура данных: Реализация алгоритма для создания таблицы поиска [дубликат] теперь является мертвым сообщением, пожалуйста, обращайтесь к этому как к правильный. У меня были проблемы с моим браузером прошлой ночью, когда я пытался продолжить редактирование старого. Я планировал удалить его, но я оставлю его там для исторических целей, и пусть администрация решит, удалять его или нет.


person Francis Cugler    schedule 05.04.2016    source источник
comment
Начните с изменения HEX_ на массив. Затем посмотрите на отдельные блоки и превратите их в циклы. Посмотрим, сможете ли вы сделать более общий метод.   -  person Mateen Ulhaq    schedule 05.04.2016
comment
Кроме того, поскольку ваши .A и .B не зависят друг от друга, вы можете выполнить этот процесс отдельно для каждого.   -  person Mateen Ulhaq    schedule 05.04.2016
comment
@MateenUlhaq да; Я вроде как понимаю это, и я пробовал проходить циклы, но когда я завершаю один фрагмент, чтобы перейти к следующему, или когда я завершаю один блок, чтобы перейти к следующему, я застреваю.   -  person Francis Cugler    schedule 05.04.2016
comment
Возможно, для моего второго изображения я смогу воспроизвести его как более крупное изображение и добавить немного больше деталей, чтобы показать обход сетки.   -  person Francis Cugler    schedule 05.04.2016
comment
Возможный дубликат Custom Data Structure: реализация алгоритма для создания таблицы поиска   -  person jbapple    schedule 05.04.2016
comment
@jbapple Да, однако это правильный вопрос, старый больше не активен и считается мертвым. У меня были проблемы с моим браузером прошлой ночью, когда я пытался отредактировать старый.   -  person Francis Cugler    schedule 05.04.2016
comment
И Антон Савин, и Сэм Варшавчик предоставили ответы с алгоритмом, который выдает правильные значения, и оба их расчета имеют разные реализации. Я дал ответ на этот вопрос Антону Савину в связи с тем, что он первым дал ответ, который дал правильные результаты. Это не имеет никакого отношения к тому, какая реализация лучше, поскольку я оставлю это для совершенно нового вопроса.   -  person Francis Cugler    schedule 05.04.2016


Ответы (3)


Например, вот так:

for (int i = 0; i < 256; ++i) {
    int cube = i / 64;
    int slice = (i % 64) / 16;
    int row = (i % 16) / 4;
    int col = i % 4;
    m_cr[i].A = cube / 2 * 8 + slice / 2 * 4 + row;
    m_cr[i].B = cube % 2 * 8 + slice % 2 * 4 + col;
}
person Anton Savin    schedule 05.04.2016
comment
Я ценю, что вы приложили усилия, чтобы выяснить расчеты, и время, чтобы удалить его из старого вопроса и опубликовать его здесь, в этом. Я думаю, что в моих первоначальных попытках я ошибся, потому что не подумал использовать оператор модуля в расчетах. И теперь, когда у меня есть это, я могу продолжить свой проект. Теперь, когда алгоритм готов, я могу изменить массив из структуры двух перечислений и использовать двухбайтовые типы данных (unsigned char), а затем сжать их в один байт, используя манипуляции с битами. Большое спасибо за это, я был в этом в течение почти недели. - person Francis Cugler; 05.04.2016
comment
@FrancisCugler нет проблем, рад, что это помогло. - person Anton Savin; 05.04.2016
comment
Мне потребовалось несколько часов, чтобы написать вопрос, не говоря уже о создании графики с помощью MS Paint, и это было после нескольких часов попыток решить это. Я пробовал одиночный цикл, двойной цикл и четырехкратный цикл, используя промежуточные счетчики и т. д., и после нескольких дней попыток я пришел сюда, надеясь, что эта функция работает, чтобы я мог перейти к остальной части структуры данных. . - person Francis Cugler; 05.04.2016

Глядя на справочную таблицу в течение нескольких минут (и только на необработанные данные в справочной таблице, я не мог следить за графикой), я полагаю, что следующий пример сгенерирует вашу справочную таблицу.

Как я уже говорил вам в вашем первом вопросе, большая часть вопроса неактуальна. Если бы вы избавились от первых 3/4 своего вопроса, кто-то, вероятно, скоро нашел бы ответ. Иногда полезно немного узнать, что означают данные, но здесь это больше отвлекает, чем что-либо еще.

В любом случае, первое, что нужно сделать, это избавиться от enum. Это не добавляет никакой ценности, а только мешает. Просто используйте натуральные шестнадцатеричные числа, вот и все. Сказав это, вам должно быть тривиально адаптировать это к вашему собственному коду:

#include <iostream>

int main()
{
    for (int n=0; n<256; ++n)
    {
        int a = ((((n >> 5) & 1) << 2) | (n & 0x80) >> 4) | ((n >> 2) & 3);
        int b = (n & 3) | (((n >> 4) & 1) << 2) |
            (((n >> 6) & 1) << 3);

        std::cout << n << ": a=" << a << " b=" << b << std::endl;
    }
}

У меня есть непреодолимое ощущение, что это можно еще немного упростить, возможно, кто-то еще может внести свой вклад в улучшение, но, в любом случае, результат этого, похоже, соответствует необработанным шестнадцатеричным значениям для A и B в вашем Справочная таблица.

person Sam Varshavchik    schedule 05.04.2016
comment
Первое изображение показывает начальное положение в левом верхнем углу: arr[0][0][0][0] двигаться влево, и это arr[0][0][0][1], следовательно, arr[box][slice][row][col] Из верхнего левого угла мы двигаемся вправо до тех пор, пока idx = 3, затем мы перемещаемся вниз к следующей строке и до тех пор, пока строка не будет равна [3][ 3]. Затем мы возвращаемся к следующему срезу и повторяем это до тех пор, пока idx среза не станет равным 3. Как только мы достигнем [0][3][3][3], мы переходим к следующему блоку и повторяем процесс. На первом изображении показан только 1 куб или коробка. Второе изображение берет полный массив 4x4x4x4, размещая его в массиве 16x16... - person Francis Cugler; 05.04.2016
comment
(...продолжение) если вы посмотрите на числа выше и слева от поля, которые не находятся в шестнадцатеричном значении на втором изображении, эти числа, пересекающиеся, являются значениями индекса массива 4x4x4x4; как видите, они повторяют 0,1,2,3. Числа в шестнадцатеричном значении — это числа, которые я хочу использовать в качестве координат в таблице перекрестных ссылок. Квадрат разделен на четыре квадранта: верхний левый, верхний правый, нижний левый и нижний правый. Каждый из этих четырех разделов представляет собой поле, в котором мы находимся. Эти указатели помечены серым текстом. Это будут array[0][][][], [1][][][], [2][][][], [3][][][]... - person Francis Cugler; 05.04.2016
comment
(...продолжение) Каждая из этих четырех коробок также разделена на четыре квадранта с одинаковым шаблоном TR, TL, BR, BL. И значение индекса для них будет array[][0][][], array[][1][][], array[][2][], array[][3][][]. - person Francis Cugler; 05.04.2016
comment
Я проверял вывод в своей консоли; и все было хорошо до значения индекса 31. Начиная со значения индекса 32, A правильно, но B неправильно. B выводит повторяющиеся 8,9,10,11, а должно быть 0,1,2,3. Индекс 32–47 — это индекс слайса 2, который является третьим слайсом блока 0. Эти значения должны быть: [4,0–3], [5, 0–3], [6, 0–3], [7, 0 - 3]. - person Francis Cugler; 05.04.2016
comment
Сделал небольшую корректировку, теперь должно совпадать. - person Sam Varshavchik; 05.04.2016
comment
Я проверю вашу настройку, однако ответ Антона Савина работает правильно. Я ценю ваши усилия. Если ваши расчеты работают правильно, я проголосую за него, чтобы удалить голосование против. - person Francis Cugler; 05.04.2016
comment
Первоначально я принял ответ Антона Савина, поскольку он первым придумал алгоритм для отображения правильных результатов, однако в конце концов я использовал ваш алгоритм. С вашими побитовыми операциями он обрабатывает примерно на 40% быстрее, чем у Антона. Операции модуля и сложения не должны быть слишком накладными, но я думаю, что его медленнее делает деление, которое должно выполняться на каждой итерации. Возможно, мне придется сесть за книгу и посчитать каждую итерацию вашего алгоритма, чтобы понять, как вы его придумали. Спасибо! - person Francis Cugler; 09.04.2016

Начните с замены HEX_ на массив. Затем посмотрите на отдельные блоки и превратите их в циклы. Поскольку ваши .A и .B являются взаимоисключающими, мы можем обрабатывать их отдельно.

Вот «функция», которую вы можете использовать для инициализации A:

void InitializeA(CrossReference arr[])
{
    InitializeABlock(arr, 0x00, 0x00);
    InitializeABlock(arr, 0x10, 0x00);
    InitializeABlock(arr, 0x20, 0x04);
    InitializeABlock(arr, 0x30, 0x04);
    InitializeABlock(arr, 0x40, 0x00);
    InitializeABlock(arr, 0x50, 0x00);
    InitializeABlock(arr, 0x60, 0x04);
    InitializeABlock(arr, 0x70, 0x04);

    InitializeABlock(arr, 0x80, 0x08);
    InitializeABlock(arr, 0x90, 0x08);
    InitializeABlock(arr, 0xA0, 0x10);
    InitializeABlock(arr, 0xB0, 0x10);
    InitializeABlock(arr, 0xC0, 0x08);
    InitializeABlock(arr, 0xD0, 0x08);
    InitializeABlock(arr, 0xE0, 0x10);
    InitializeABlock(arr, 0xF0, 0x10);
}

void InitializeABlock(CrossReference arr[], int idxStart, int hexStart)
{
    for(int j = hexStart; j < hexStart + 4; j++)
    {
        int baseIdx = idxStart + 4 * (j - hexStart);

        for(int i = 0; i < 4; i++)
        {
            arr[baseIdx + i].A = j;
        }
    }
}

Реализация для B очень похожа:

void InitializeB(CrossReference arr[])
{
    InitializeBBlock(arr, 0x00, 0x00);
    InitializeBBlock(arr, 0x10, 0x00);
    InitializeBBlock(arr, 0x20, 0x04);
    InitializeBBlock(arr, 0x30, 0x04);
    InitializeBBlock(arr, 0x40, 0x00);
    InitializeBBlock(arr, 0x50, 0x00);
    InitializeBBlock(arr, 0x60, 0x04);
    InitializeBBlock(arr, 0x70, 0x04);

    InitializeBBlock(arr, 0x80, 0x08);
    InitializeBBlock(arr, 0x90, 0x08);
    InitializeBBlock(arr, 0xA0, 0x10);
    InitializeBBlock(arr, 0xB0, 0x10);
    InitializeBBlock(arr, 0xC0, 0x08);
    InitializeBBlock(arr, 0xD0, 0x08);
    InitializeBBlock(arr, 0xE0, 0x10);
    InitializeBBlock(arr, 0xF0, 0x10);
}

void InitializeBBlock(CrossReference arr[], int idxStart, int hexStart)
{
    for(int j = idxStart; j < idxStart + 4; j++)
    {
        int baseIdx = idxStart + 4 * (j - idxStart);

        for(int i = 0; i < 4; i++)
        {
            arr[baseIdx + i].A = i + hexStart;
        }
    }
}

Вы можете, конечно, сжать это дальше. ;)

person Mateen Ulhaq    schedule 05.04.2016
comment
Я думаю, вы не понимаете A и B. A и B не являются отдельными парами. A идет вниз по конструкции, а B идет поперек конструкции. Думайте об A как о y, а о B как о x в декартовых координатах. - person Francis Cugler; 05.04.2016