Тебе не нужны
new
и сырые указатели. Тебе нужен линейный контейнер с хранением элементов в непрерывном блоке памяти. Это будет или
std::vector
, или
std::array
.
Для начала можно остановиться на
векторе. Еще одним важным типом будет
std::span
[
?] или
gsl::span
[
?][
S] если ты не можешь пользоваться C++20.
При реализации твоей функции нужно понять, зачем в твою функцию добавлять управление памятью. В общих случаях, если разработчик начинает управлять памятью в вычислительной функции, это говорит о плохо продуманном алгоритме функции. В редких случаях управление памятью может быть технически обосновано. Твой случай не из таких. В нем незачем управлять памятью, это пользы не сделает, а приведет лишь к переусложнению реализации.
Вот объвление твоей функции:
gsl::span<float> Метод( gsl::span<float> values )
.
span
- это не владеющий памятью тип, обозначающий участок непрерывной памяти с данными определенного типа.
span
очень легок и является value type - т.е. создан чтобы его передача по значению не приводила к ощутимым нагрузкам.
span
конструируется из
std::vector
,
std::array
, плоских массивов,
std::unique_ptr<[]>
и сырых блоков памяти.
В своей функции тебе стоит работать с памятью
values
, считая попутно, сколько элементов ты обработал. А для возврата обработанного участка данных тебе будет достаточно вызвать
subspan.
Псевдокодstd::span<float> Метод( std::span<float> values )
{
size_t processed_count = 0;
for( float& element : values )
{
// ... обработка значений
// ... изменение processed_count
// ... условия обрыва цикла
}
return values.subspan( 0, processed_count );
}
int main()
{
std::vector<float> values{ 7.83f, 14.1f, 20.3f };
std::span<float> processed_values = Метод( values );
for( const float& value : processed_values )
{
std::cout << value << ' ';
}
return 0;
}