Оборачивать динамический массив в контейнер STL / Boost?

Можно использовать пользовательские атрибуты в качестве простого способа определить значения тега в sub классах, не имея необходимость писать тот же код много раз для каждого подкласса. Я столкнулся с хорошим краткий пример John Waters из как определить и использовать пользовательские атрибуты в Вашем собственном коде.

существует учебное руководство в http://msdn.microsoft.com/en-us/library/aa288454 (По сравнению с 71) .aspx

8
задан Roman Nikitchenko 18 February 2015 в 01:11
поделиться

6 ответов

Одно из лучших решений для этого - что-то вроде шаблона array_proxy <> STLSoft. К сожалению, страница документа, созданная doxygen из исходного кода, не очень помогает понять шаблон. Исходный код может быть немного лучше:

Шаблон array_proxy <> прекрасно описан в Книга Мэтью Уилсона, Несовершенный C ++ . Версия, которую я использовал, является урезанной версией того, что есть на сайте STLSoft, поэтому мне не пришлось тянуть всю библиотеку. Моя версия не такая портативная, t верно для собственных массивов. И размер обернутого массива не является частью типа шаблона, поэтому его можно довольно гибко использовать.

11
ответ дан 5 December 2019 в 06:23
поделиться

A boost :: iterator_range предоставляет интерфейс, подобный контейнеру:

// Memory map an array of doubles:
size_t number_of_doubles_to_map = 100;
double* from_mmap = mmap_n_doubles(number_of_doubles_to_map);

// Wrap that in an iterator_range
typedef boost::iterator_range<double*> MappedDoubles;
MappedDoubles mapped(from_mmap, from_mmap + number_of_doubles_to_map);

// Use the range
MappedDoubles::iterator b = mapped.begin();
MappedDoubles::iterator e = mapped.end();
mapped[0] = 1.1;
double first = mapped(0);

if (mapped.empty()){
    std::cout << "empty";
}
else{
    std::cout << "We have " << mapped.size() << "elements. Here they are:\n"
       << mapped;
}
9
ответ дан 5 December 2019 в 06:23
поделиться

Однажды я решил сделать то же самое. После нескольких дней размышлений и попыток я решил, что оно того не стоит. В итоге я создал свой собственный вектор, который вел себя как std :: vector, но имел только те функции, которые мне действительно были нужны, такие как проверка привязки, итераторы и т.д. Тогда было создать собственный распределитель. Я никогда не писал ни одного, но, поскольку это единственный способ контролировать управление памятью в STL, возможно, там что-то можно сделать.

2
ответ дан 5 December 2019 в 06:23
поделиться

Нет, это невозможно с использованием std :: vector .

Но если возможно, вы можете создать вектор с этим размером и сопоставить файл с это вместо этого.

std::vector<double> v(100);
mmapfile_double(&v[0], 100);
1
ответ дан 5 December 2019 в 06:23
поделиться

А как насчет вектора указателей, указывающих на элементы отображаемой области (уменьшенное потребление памяти как sizeof (double *)

Есть некоторые недостатки (в первую очередь, вам нужны специальные предикаты для сортировки), но есть и некоторые преимущества, например, вы можете удалять элементы без изменения фактического сопоставленного содержимого (или иметь четное количество таких массивов с другой порядок элементов без каких-либо изменений в фактических значениях).

Есть общая проблема всех решений с std :: vector в отображаемом файле: "прибить" векторный контент к отображаемой области. Это невозможно отследить, вы можете только следить за собой, чтобы не использовать что-то, что может привести к перераспределению векторного содержимого. Так что будьте в любом случае осторожны.

1
ответ дан 5 December 2019 в 06:23
поделиться

Вы можете использовать array_proxy <> или взглянуть на Boost.Array . Он дает вам size (), front (), back (), at (), operator [] и т. Д. Лично я бы предпочел Boost.Array, так как Boost в любом случае более распространен.

1
ответ дан 5 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: