Я бы использовал вектор на данный момент, , но , введите для него имя, а не пишите std::vector
прямо там, где он используется:
typedef std::vector vec_type;
class A {
vec_type<B*> whatever;
};
Затем, когда / если это становится проблемой, вы можете изменить это имя typedef для ссылки на вектороподобный класс, который оптимизирован для небольшого числа содержащихся объектов (например, выполняет что-то вроде оптимизации с небольшими строками, которая является обычной много реализаций std::string
).
Другая возможность (хотя мне это тоже не нравится) - продолжать использовать имя «вектор» напрямую, но использовать объявление using
, чтобы указать, что vector
использовать:
class A {
using std::vector;
vector<B*> whatever;
};
В этом случае, когда / если необходимо, вы помещаете замену vector
в пространство имен и изменяете объявление using
, указывая вместо этого:
class A {
using my_optimized_version::vector;
// the rest of the code remains unchanged:
vector<B*> whatever;
};
Что касается реализации оптимизированного класса, типичный способ выглядит примерно так:
template <class T>
class pseudo_vector {
T small_data[5];
T *data;
size_t size;
size_t allocated;
public:
// ...
};
Затем, если у вас есть 5 или меньше предметов для хранения, вы помещаете их в small_data
. Когда / если ваш вектор содержит больше элементов, чем этот фиксированный предел, вы выделяете пространство в куче и используете data
, чтобы указать на него.
В зависимости от того, что вы пытаетесь оптимизировать, вы можете использовать абстрактный базовый класс с двумя потомками, один для маленьких векторов, а другой для больших векторов, с классом, похожим на pimpl, чтобы обернуть их и заставить один действовать как то, что вы можете использовать напрямую.
Еще одна возможность, которая может быть полезна в некоторых ситуациях, - это продолжать использовать std::vector
, но предоставить собственный объект Allocator для использования при получении пространства хранения. Поиск в Google для «распределителя небольших объектов» должен привести к появлению нескольких кандидатов, которые уже были написаны. В зависимости от ситуации вы можете использовать один из них напрямую или использовать его как источник вдохновения для написания своего собственного.