У меня есть класс SpecialArray
, к которому можно получить доступ так же, как и стандартный двумерный массив; то есть как A[i][j]
. Часто бывает необходимо извлечь одномерный массив из int
с этого объекта. Детали извлечения, зависящие от других переданных параметров, несущественны; Я заинтересован в разработке интерфейса операции.Каковы преимущества и недостатки использования классов, которые отличаются только конструкторами?
Каковы преимущества и недостатки следующих подходов к решению этой задачи?
Вариант 1
Определим функцию:
std::vector<int> extract(const SpecialArray &A, ...)
где здесь ...
относится к другим параметрам, которые определяют содержание одномерного массива, а также использовать его в качестве:
std::vector<int> output = extract(A,...);
Вариант 2
Мы создаем класс, который наследуется от станд :: вектор и строит себя:
class SpecialArrayExtract : public std::vector<int> {
public:
SpecialArrayExtract(const SpecialArray &A, ...);
};
где конструктор (или, что то же самое, init
функция) использует ...
вход для заполнения *this
с соответствующими данными, и мы используем его как:
SpecialArrayExtract output(A,...);
Вариант 3
Переходим точно так, как в варианте 2, но не наследуют от std::vector<int>
и вместо того, чтобы иметь private
элемент std::vector<int>
с интерфейсом подвергаются при необходимости:
class SpecialArrayExtract {
private:
std::vector<int> m_data;
public:
SpecialArrayExtract(const SpecialArray &A, ...);
[Wrapper functions for std::vector<int> here.]
};
Комментарий
Приложение высокоэффективная, но с RVO в Варианте 1, я предполагаю, что все они должны выполняться эквивалентно.
Закрепляя это обратно в заголовок, точка, которую я пытаюсь понять, состоит в том, что оба варианта 2 и 3 определяют классы, которые по существу равны std::vector<int>
с другим именем и специальным конструктором. когда - если когда-либо! - Это разумная идея, и какой из них лучше?
Итак, у вас есть структура данных, которая содержит несколько массивов, и вам необходимо предоставить доступ ко всем массивам? Ваш метод извлечения копирует из внутреннего хранимого массива в целевой массив (независимо от того, является ли RVO или семантикой перемещения); действительно ли нужно его скопировать? – dyp
Вариант 2 очень плохой, вы не должны наследовать публично из std :: vector, так как он не имеет виртуального деструктора ... – JBL
@DyP Выделенный массив представляет собой последовательность элементов из исходного многомерного массива, которые не являются [вероятными] рядом с памятью. (То есть, я не просто вытаскиваю столбец или строку матрицы здесь.) Мне нужно будет циклически перебирать извлеченный массив, и мне нужно, чтобы эти элементы были смежными в памяти для оптимального использования кеша. – Ben