std::raw_storage_iterator
| Определено в заголовочном файле <memory>
|
||
template< class OutputIt, class T > class raw_storage_iterator : public std::iterator<std::output_iterator_tag, void, void, void, void>; |
(до 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 (шаблон класса) |