Можно ли совместить в памяти два массива?

 

Есть большой массив M1 содержащий данные. Хочется получать выборку данных некоторой длины во второй массив M2 меньшего размера.

Хочется сделать это максимально быстро, не используя копирование элементов.

Например было бы здорово просто совместить массивы в памяти с некоторым смещением D.

Можно ли сделать это средствами MQL5?

 
Если достаточно смещения, то есть элементы второго массиву идут в том же порядке, что и основного массива, то достаточно написать функцию, в которой будет индекс пересчитываться. Можно и без функции - на лету вычислять. Всего-то - прибавить переменную.
 
Dmitry Fedoseev:
Если достаточно смещения, то есть элементы второго массиву идут в том же порядке, что и основного массива, то достаточно написать функцию, в которой будет индекс пересчитываться. Можно и без функции - на лету вычислять. Всего-то - прибавить переменную.

Я понимаю, что вместо обращения к элементам массива М2 можно обращаться к элементам массива М1 добавив к индексам смещение D.

Но хотелось получать просто значения из массива М2 размещенного динамически на области памяти массива М1 без указания дополнительных параметров (смещения).

 

Встроенные массивы - сущности неполноценные (нельзя указатель на них), если не ошибаюсь, поэтому нужна обёртка. Могу предложить такой вариант https://www.mql5.com/ru/forum/221917/page26#comment_11233214

class Awrap {
   const vector_fund<int> *ar;
   uint shift;
public:
   Awrap(const vector_fund<int> &_ar, uint _shift): ar(&_ar), shift(_shift) {}
   int operator [](uint i) {return ar.a[i+this.shift];}
   uint size() {return this.ar.size()-this.shift;}
};

void OnStart()
{
   vector_fund<int> v;
   v.push_back(0);
   v.push_back(1);
   v.push_back(2);
   v.push_back(3);
   
   Awrap wr(v, 2);
   Alert(wr.size()); // 2
   for (uint i = 0;  i < wr.size();  ++ i)
      Alert(wr[i]);  // 2, 3
}
Я на коленках писал, вам, наверное, ещё и кол-во элементов нужно в Awrap передавать.
 
Vict:

Встроенные массивы - сущности неполноценные (нельзя указатель на них), если не ошибаюсь, поэтому нужна обёртка. Могу предложить такой вариант https://www.mql5.com/ru/forum/221917/page26#comment_11233214

Я на коленках писал, вам, наверное, ещё и кол-во элементов нужно в Awrap передавать.
Спасибо. Хотя и несколько громоздео выглядит, но идея хорошая.
 
Можно "на лету" конвертировать М1 в М2 - вот вам и будет использование только одного массива.
 
Yury Kirillov:

Есть большой массив M1 содержащий данные. Хочется получать выборку данных некоторой длины во второй массив M2 меньшего размера.

Хочется сделать это максимально быстро, не используя копирование элементов.

Например было бы здорово просто совместить массивы в памяти с некоторым смещением D.

Можно ли сделать это средствами MQL5?

Видимо имеется в виду индексный массив, в который записываются требуемые номера элементов из M1. Тогда доступ к ним - через двойную индексацию M1[index[i]]. здесь index[] - целочисленный массив размера M2.

Причина обращения: