Из того, что я читал в http://en.cppreference.com/w/cpp/memory/allocator, большинство функций распределителей теперь будут устаревшими. Вопрос в том, как следует использовать распределители в новом коде? Каков сейчас «правильный» способ?Как использовать распределители в современном C++
Из того, что я вывел в документации, construct
является частью признаков распределителя, а не самого распределителя.
Я создаю пользовательский контейнер, здесь это очень простая версия конструктора, это хорошее использование нового дизайна?
container::container(std::size_t size, T const& value, Allocator const& allocator) : allocator_(allocator){
data_ = std::allocator_traits<Alloc>::allocate(allocator_, size);
for(auto ptr = data_; ptr != data_ + size; ++ptr){
std::allocator_traits<Allocator>::construct(allocator_, ptr, value)
}
}
Я пытался использовать алгоритм (как std::for_each
) в цикле, но мне не удалось использовать один без учета адресов (operator&
).
Где я могу найти полный пример современного распределителя?
После некоторой настройки, я нашел способ использовать алгоритм вместо исходного контура (к которому политика выполнения может быть передана). Я не очень уверен, но это может быть такой:
data_ = std::allocator_traits<Allocator>::allocate(allocator_, size);
std::for_each([policy? deduced from allocator?,]
boost::make_counting_iterator(data_),
boost::make_counting_iterator(data_ + size),
[&](auto ptr){std::allocator_traits<Allocator>::construct(allocator_, ptr, value);}
);
Это был правильный способ сделать это с C++ 11 (по модулю сломанного состояния цикла 'for'). C++ 17 ничего не меняет, кроме как обесценивать кучу функций, которые вы все равно не должны вызывать. Кроме того, нет 'construct_n'. –
"* Из того, что я читал в http://en.cppreference.com/w/cpp/memory/allocator, большинство функций распределителей теперь будут удалены и устарели. *« Исправление: это не то, что »устарело " означает. Устаревшее не означает «разделение». Это означает «подлежащее удалению в * более поздней версии». Он еще никуда не денется. –
@ T.C., Я исправил код (цикл).Каким будет правильный способ написать цикл (например, можно дать политику выполнения, 'std :: for_each'? (Из чего). – alfC