Если вы работаете в C++ 11, вам, вероятно, следует работать с unique_ptr<T[]>
, а не с scoped_array<T>
. Он может делать все, что может scoped_array
, а затем и некоторые.
Если вы хотите прямоугольный массив, я рекомендую использовать unique_ptr<double[]>
для хранения основных данных и unique_ptr<double*[]>
для хранения баз строк. Это будет работать что-то вроде этого:
unique_ptr<double[]> data{ new double[5*3] };
unique_ptr<double*[]> rows{ new double*[3] };
rows[0] = data.get();
for (size_t i = 1; i!=5; ++i)
rows[i] = rows[i-1]+3;
Затем вы можете передать rows.get()
на функцию, принимающую double**
. Этот подход может работать и для непрямоугольного массива, если геометрия массива известна во время создания массива, так что вы можете сразу распределить все данные и указать rows
на правильные смещения. (Это может быть не так просто, как простой цикл).
Это также даст вам лучшую локальность ссылок и использования памяти, поскольку вы выполняете только два распределения. Все ваши данные будут сохранены вместе в памяти, и для отдельных распределений не будет дополнительных накладных расходов.
Если вы хотите изменить геометрию массива с зубчатым колесом после его создания, вам необходимо разработать принципиальный способ управления хранилищем для этого решения. Однако, поскольку изменение геометрии с использованием scoped_array
неудобно (требует специального использования swap()
), я не удивлюсь, если это не проблема для вас.
(Обратите внимание, что этот подход может работать с scoped_array
, а также unique_ptr<[]>
, я просто иллюстрирующим его с помощью unique_ptr
, так как мы в C++ 11 в настоящее время.)
Что такое API вашего «устаревшего кода»? Я не вижу, как вы могли бы передать зубчатый массив как 'double **' - где информация о размере? – Casey