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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yury Kirillov
5298
Yury Kirillov  

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

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

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

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

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

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

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

Vict
732
Vict  

Встроенные массивы - сущности неполноценные (нельзя указатель на них), если не ошибаюсь, поэтому нужна обёртка. Могу предложить такой вариант 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 передавать.
Yury Kirillov
5298
Yury Kirillov  
Vict:

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

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

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

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

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий