Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

Виртуальный массив

#cpp #массивы


Допустим есть два обычных одномерных массива и есть функция принимающая один массив.
Необходимо объединить эти два массива в один и передать его в функцию. Как объединить
массивы классическим способом я знаю. Но на выделение дополнительной памяти для третьего
массива и копирование внутрь него двух других массивов очень дорогостоящая операция.
Меня интересует существует ли структура которая позволяет виртуально объединить несколько
массивов в один на уровне индексации памяти и имеет свойства обычного массива? Вот пример:

#include 

void print(int c[6]){
     for (int i = 0; i < 6; i++)
        std::cout << c[i];
}

int main(){
  int a[3] = { 1, 2, 3 };
  int b[3] = { 4, 5, 6 };

  // здесь создать виртуальный массив из индексов памяти массивов a и b
  print(/* и передать его сюда */);
}

    


Ответы

Ответ 1



Вам в любом случае придется переопределять функцию, либо создавать новый массив из имеющихся массивов. Один из подходов может состоять в определении функции, которая принимает список инициализации. Например, #include #include #include void print(std::initializer_list> arrays) { for ( const auto &p : arrays ) { for (size_t i = 0; i < p.second; i++) { std::cout << p.first[i] << ' '; } } std::cout << std::endl; } int main() { int a[3] = { 1, 2, 3 }; int b[3] = { 4, 5, 6 }; print({ { a, 3 }, { b, 3 } }); } Вывод программы на консоль будет 1 2 3 4 5 6 Вы эту функцию можете объявить одновременно вместе с перегруженной функцией void print( const int *a, size_t n );

Ответ 2



Для этой цели хорошо сгодится библиотека Ranges, которая умеет делать "ленивые" вычисления. В будущем предполагается добавить её в стандарт языка C++. Меня интересует существует ли структура которая позволяет виртуально объединить несколько массивов в один на уровне индексации памяти и имеет свойства обычного массива? Именно это она и умеет делать. Буквально на днях мелькала статья практически с Вашим примером (ленивая конкатенация строк) - Идиома Ranges Ссылка на библиотеку - range-v3 Попытка написать рабочий код при помощи этой библиотеки: #include #include template void print(Range c){ for (auto elem : c) std::cout << elem; } int main(){ int a[3] = { 1, 2, 3 }; int b[3] = { 4, 5, 6 }; auto c = ranges::v3::view::concat(a, b); print(c); } P.S. Не уверен, умеет ли concat работать с чистыми массивами.

Комментариев нет:

Отправить комментарий