Пространства имён
Варианты
Действия

std::raw_storage_iterator

Материал из cppreference.com
< cpp‎ | memory
 
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
raw_storage_iterator
(до C++20*)
 
 
Определено в заголовочном файле <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

void

(до C++20)

std::ptrdiff_t

(начиная с C++20)
pointer void
reference void

Типы элемены iterator_category, value_type, difference_type, pointer и reference должны быть получены путём наследования от std::iterator<std::output_iterator_tag, void, void, void, 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);
}

Вывод:

Это
тест
.

[править] Смотрите также

предоставляет информацию о типах аллокаторов
(шаблон класса) [править]
реализует многоуровневый аллокатор для многоуровневых контейнеров
(шаблон класса) [править]
проверяет, поддерживает ли указанный тип конструирование с uses_allocator
(шаблон класса) [править]