(C++17) | ||||
Sequence | ||||
(C++11) | ||||
(C++26) | ||||
(C++26) | ||||
(C++11) | ||||
Associative | ||||
Unordered associative | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
(C++11) | ||||
Adaptors | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
Views | ||||
(C++20) | ||||
(C++23) | ||||
Tables | ||||
Iterator invalidation | ||||
Member function table | ||||
Non-member function table |
Member functions | |||||||
Non-member functions | |||||||
| |||||||
Deduction guides(C++17) |
(1) | ||
set(); | (until C++11) | |
set(): set(Compare()){} | (since C++11) (constexpr since C++26) | |
explicit set(const Compare& comp, const Allocator& alloc= Allocator()); | (2) | (constexpr since C++26) |
explicit set(const Allocator& alloc); | (3) | (since C++11) (constexpr since C++26) |
template<class InputIt> set( InputIt first, InputIt last, | (4) | (constexpr since C++26) |
template<class InputIt> set( InputIt first, InputIt last, | (5) | (since C++14) (constexpr since C++26) |
set(const set& other); | (6) | (constexpr since C++26) |
set(const set& other,const Allocator& alloc); | (7) | (since C++11) (constexpr since C++26) |
set( set&& other); | (8) | (since C++11) (constexpr since C++26) |
set( set&& other,const Allocator& alloc); | (9) | (since C++11) (constexpr since C++26) |
set(std::initializer_list<value_type> init, const Compare& comp= Compare(), | (10) | (since C++11) (constexpr since C++26) |
set(std::initializer_list<value_type> init, const Allocator& alloc) | (11) | (since C++14) (constexpr since C++26) |
template<container-compatible-range<value_type> R> set(std::from_range_t, R&& rg, | (12) | (since C++23) (constexpr since C++26) |
template<container-compatible-range<value_type> R> set(std::from_range_t, R&& rg, | (13) | (since C++23) (constexpr since C++26) |
Constructs new container from a variety of data sources and optionally using user supplied allocatoralloc or comparison function objectcomp.
[
first,
last)
.[
first,
last)
is not avalid range, the behavior is undefined.Ifalloc is not provided, allocator is obtained by callingstd::allocator_traits<allocator_type>:: | (since C++11) |
Duringclass template argument deduction, only the first argument contributes to the deduction of the container's | (since C++23) |
Duringclass template argument deduction, only the first argument contributes to the deduction of the container's | (since C++23) |
Contents |
alloc | - | allocator to use for all memory allocations of this container |
comp | - | comparison function object to use for all comparisons of keys |
first, last | - | the pair of iterators defining the sourcerange of elements to copy |
other | - | another container to be used as source to initialize the elements of the container with |
init | - | initializer list to initialize the elements of the container with |
rg | - | acontainer compatible range, that is, aninput_range whose elements are convertible tovalue_type |
Type requirements | ||
-InputIt must meet the requirements ofLegacyInputIterator. | ||
-Compare must meet the requirements ofCompare. | ||
-Allocator must meet the requirements ofAllocator. |
[
first,
last)
is already sorted byvalue_comp().Calls toAllocator::allocate
may throw.
After container move construction (overload(8,9)), references, pointers, and iterators (other than the end iterator) toother remain valid, but refer to elements that are now in*this. The current standard makes this guarantee via the blanket statement in[container.reqmts]/67, and a more direct guarantee is under consideration viaLWG issue 2321.
If multiple elements in the range have keys that compare equivalent, it is unspecified which element is inserted (pendingLWG2844).
Although not formally required until C++23, some implementations has already put the template parameterAllocator
intonon-deduced contexts in earlier modes.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_containers_ranges | 202202L | (C++23) | Ranges-aware construction and insertion; overloads(12,13) |
#include <cmath>#include <iostream>#include <set>#include <string> struct Point{double x, y;}; struct PointCmp{bool operator()(const Point& lhs,const Point& rhs)const{returnstd::hypot(lhs.x, lhs.y)<std::hypot(rhs.x, rhs.y);}}; std::ostream& operator<<(std::ostream& os, Point pt){return os<<'('<< pt.x<<','<< pt.x<<')';} void println(auto rem,constauto& seq){std::cout<< rem<<'{';for(auto n{seq.size()};constauto& elm: seq)std::cout<< elm<<(--n?", ":"");std::cout<<"}\n";} int main(){// (1) Default constructorstd::set<std::string> a; a.insert("horse"); a.insert("cat"); a.insert("dog"); println("1) a: ", a); // (4) Range constructorstd::set<std::string> b(a.find("dog"), a.end()); println("2) b: ", b); // (6) Copy constructorstd::set<std::string> c(a); c.insert("another horse"); println("3) c: ", c); // (8) Move constructorstd::set<std::string> d(std::move(a)); println("4) d: ", d); println("5) a: ", a); // (10) Initializer list constructorstd::set<std::string> e{"one","two","three","five","eight"}; println("6) e: ", e); // Custom comparisonstd::set<Point, PointCmp> f={{2,5},{3,4},{1,1}}; f.insert({1,-1});// This fails because the magnitude of (1,-1) equals (1,1) println("7) f: ", f); // (12) Range constructorconstauto w={"Eurybia","Theia","Rhea","Aura","Mnemosyne","Mnemosyne"};#if __cpp_lib_containers_rangesstd::set<std::string> g(std::from_range, w);// overload (12)#elsestd::set<std::string> g(w.begin(), w.end());// fallback to (4)#endif println("8) g: ", g);}
Possible output:
1) a: {cat, dog, horse}2) b: {dog, horse}3) c: {another horse, cat, dog, horse}4) d: {cat, dog, horse}5) a: {}6) e: {eight, five, one, three, two}7) f: {(1,1), (3,3), (2,2)}8) g: {Aura, Eurybia, Mnemosyne, Rhea, Theia}
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2076 | C++11 | overload(4) conditionally requiredKey to beCopyInsertable into*this | not required |
LWG 2193 | C++11 | the default constructor was explicit | made non-explicit |
assigns values to the container (public member function)[edit] |