LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

На каком этапе тормоза вылезут?

На этапе преобразования индексов.
На самом деле я поддерживаю идею двух массивов.
но если хочешь извращений, то как-то так (пишу навскидку, код не проверял, идею, думаю, поймешь)

class A{
  T a;
  T b;
};
class B: A{
  T c;
  T d;
  
  A GetA1(){ return A(a,b); }
  A GetA2(){ return A(c,d); }

  B();
  B(A A1, A A2):A(A1),c(A2.a),d(A2.b){};
};

class Container{
  std::vector<A> arr[size]; // Сам определи как ты размер задашь
  A GetA(int i){ return arr[i];}
  B GetB(int i){ return B(arr[arr.size()-2-i*2],arr[arr.size()-1-i*2]); }
}

Говнокод. Сам проставишь константы, сделаешь чтобы лишний раз a, b, c, d не копировались, а возвращались ссылками. Но идею, думаю, ты понял.
Еще:
- изменение размера массива создаст еще накладные расходы
- надеюсь, ты проконтроллируешь, чтобы одна половина массива не налезла на другую.
- коль ты пишешь на C++, настоятельно рекомендую использовать vector вместо C-шных массивов.

Исправление Kroz, :

На каком этапе тормоза вылезут?

На этапе преобразования индексов.
На самом деле я поддерживаю идею двух массивов.
но если хочешь извращений, то как-то так (пишу навскидку, код не проверял, идею, думаю, поймешь)

class A{
  T a;
  T b;
};
class B: A{
  T c;
  T d;
  
  A GetA1(){ return A(a,b); }
  A GetA2(){ return A(c,d); }

  B();
  B(A A1, A A2):A(A1),c(A2.a),d(A2.b){};
};

class Container{
  std::vector<A> arr[size]; // Сам определи как ты размер задашь
  A GetA(int i){ return arr[i];}
  B GetB(int i){ return B(arr[arr.size()-2-i*2],arr[arr.size()-1-i*2]); }
}

Говнокод. Сам проставишь константы, сделаешь чтобы лишний раз a, b, c, d не копировались, а возвращались ссылками. Но идею, думаю, ты понял.
Еще:
- изменение размера массива создаст еще накладные расходы
- надеюсь, ты проконтроллируешь, чтобы одна половина массива не налезла на другую.

Исходная версия Kroz, :

На каком этапе тормоза вылезут?

На этапе преобразования индексов.
На самом деле я поддерживаю идею двух массивов.
но если хочешь извращений, то как-то так (пишу навскидку, код не проверял, идую, думаю, поймешь)

class A{
  T a;
  T b;
};
class B: A{
  T c;
  T d;
  
  A GetA1(){ return A(a,b); }
  A GetA2(){ return A(c,d); }

  B();
  B(A A1, A A2):A(A1),c(A2.a),d(A2.b){};
};

class Container{
  std::vector<A> arr[size]; // Сам определи как ты размер задашь
  A GetA(int i){ return arr[i];}
  B GetB(int i){ return B(arr[arr.size()-2-i*2],arr[arr.size()-1-i*2]); }
}

Говнокод. Сам проставишь константы, сделаешь чтобы лишний раз a, b, c, d не копировались, а возвращались ссылками. Но идею, думаю, ты понял.
Еще:
- изменение размера массива создаст еще накладные расходы
- надеюсь, ты проконтроллируешь, чтобы одна половина массива не налезла на другую.