|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Defined in header <memory> | ||
template<class OutputIt,class T> class raw_storage_iterator | (until C++17) | |
template<class OutputIt,class T> class raw_storage_iterator; | (since C++17) (deprecated in C++17) (removed in C++20) | |
The output iteratorstd::raw_storage_iterator makes it possible for standard algorithms to store results in uninitialized memory. Whenever the algorithm writes an object of typeT to the dereferenced iterator, the object is copy-constructed into the location in the uninitialized storage pointed to by the iterator. The template parameterOutputIt is any type that meets the requirements ofLegacyOutputIterator and hasoperator* defined to return an object, for whichoperator& returns an object of typeT*. Usually, the typeT* is used asOutputIt.
Contents |
-OutputIt must meet the requirements ofLegacyOutputIterator. |
creates a newraw_storage_iterator(public member function)[edit] | |
| constructs an object at the pointed-to location in the buffer (public member function)[edit] | |
| dereferences the iterator (public member function)[edit] | |
| advances the iterator (public member function)[edit] | |
(since C++17) | provides access to the wrapped iterator (public member function)[edit] |
| Member type | Definition | ||||
iterator_category | std::output_iterator_tag | ||||
value_type | void | ||||
difference_type |
| ||||
pointer | void | ||||
reference | void |
Member types | (until C++17) |
std::raw_storage_iterator was deprecated primarily because of its exception-unsafe behavior. Unlikestd::uninitialized_copy, it doesn't handle exceptions during operations likestd::copy safely, potentially leading to resource leaks due to a lack of tracking the number of successfully constructed objects and their proper destruction in the presence of exceptions.
#include <algorithm>#include <iostream>#include <memory>#include <string> int main(){conststd::string s[]={"This","is","a","test","."};std::string* p=std::allocator<std::string>().allocate(5); std::copy(std::begin(s),std::end(s), std::raw_storage_iterator<std::string*,std::string>(p)); for(std::string* i= p; i!= p+5;++i){std::cout<<*i<<'\n'; i->~basic_string<char>();}std::allocator<std::string>().deallocate(p,5);}
Output:
Thisisatest.
(C++11) | provides information about allocator types (class template)[edit] |
(C++11) | implements multi-level allocator for multi-level containers (class template)[edit] |
(C++11) | checks if the specified type supports uses-allocator construction (class template)[edit] |