std::raw_storage_iterator
Определено в заголовочном файле <memory>
|
||
template< class OutputIt, class T > class raw_storage_iterator |
(до C++17) | |
template< class OutputIt, class T > class raw_storage_iterator; |
(начиная с C++17) (устарело в C++17) (удалено в C++20) |
|
Оператор вывода std::raw_storage_iterator
позволяет стандартным алгоритмам сохранять результаты в неинициализированной памяти. Всякий раз, когда алгоритм записывает объект типа T
в разыменованный итератор, объект создаётся копированием в месте в неинициализированной памяти, на которое указывает итератор. Параметр шаблона OutputIt
это любой тип, который соответствует требованиям LegacyOutputIterator и имеет operator*, определённый для возврата объекта, для которого operator& возвращает объект типа T*
. Обычно тип T*
используется как OutputIt
.
Содержание |
[править] Требования к типу
-OutputIt должен соответствовать требованиям LegacyOutputIterator.
|
[править] Функции-элементы
создаёт новый raw_storage_iterator (public функция-элемент) | |
создаёт объект в указанном месте в буфере (public функция-элемент) | |
разыменовывает итератор (public функция-элемент) | |
продвигает итератор (public функция-элемент) | |
(начиная с C++17) |
предоставляет доступ к обёрнутому итератору (public функция-элемент) |
[править] Типы элементы
Тип элемент | Определение | ||||
iterator_category
|
std::output_iterator_tag | ||||
value_type
|
void | ||||
difference_type
|
| ||||
pointer
|
void | ||||
reference
|
void |
Типы элемены |
(до C++17) |
[править] Примечание
std::raw_storage_iterator
устарел в первую очередь из-за его небезопасного поведения в отношении исключений. В отличие от std::uninitialized_copy, он не обрабатывает исключения во время таких операций, как std::copy, что потенциально может привести к утечкам ресурсов из-за отсутствия отслеживания количества успешно созданных объектов, и отсутствию их надлежащего уничтожения при наличии исключений.
[править] Пример
#include <iostream> #include <string> #include <memory> #include <algorithm> int main() { const std::string s[] = {"Это", "тест", "."}; std::string* p = std::allocator<std::string>().allocate(3); std::copy(std::begin(s), std::end(s), std::raw_storage_iterator<std::string*, std::string>(p)); for(std::string* i = p; i!=p+3; ++i) { std::cout << *i << '\n'; i->~basic_string<char>(); } std::allocator<std::string>().deallocate(p, 3); }
Вывод:
Это тест .
[править] Смотрите также
(C++11) |
предоставляет информацию о типах аллокаторов (шаблон класса) |
(C++11) |
реализует многоуровневый аллокатор для многоуровневых контейнеров (шаблон класса) |
(C++11) |
проверяет, поддерживает ли указанный тип конструирование с uses_allocator (шаблон класса) |