std::set<Key,Compare,Allocator>::set
(constexpr since C++26)
const Allocator& alloc = Allocator() );
(constexpr since C++26)
set( InputIt first, InputIt last,
const Compare& comp = Compare(),
set( InputIt first, InputIt last,
const Allocator& alloc )
(constexpr since C++26)
(constexpr since C++26)
(constexpr since C++26)
(constexpr since C++26)
const Compare& comp = Compare(),
(constexpr since C++26)
const Allocator& alloc )
(constexpr since C++26)
set( std::from_range_t, R&& rg,
const Compare& comp = Compare(),
(constexpr since C++26)
set( std::from_range_t, R&& rg,
const Allocator& alloc )
(constexpr since C++26)
Constructs new container from a variety of data sources and optionally using user supplied allocator alloc or comparison function object comp.
[
first,
last)
.[
first,
last)
is not a valid range, the behavior is undefined.If alloc is not provided, allocator is obtained by calling std::allocator_traits <allocator_type>::
select_on_container_copy_construction(other.get_allocator()).
During class template argument deduction, only the first argument contributes to the deduction of the container's Allocator
template parameter.
During class template argument deduction, only the first argument contributes to the deduction of the container's Allocator
template parameter.
[edit] Parameters
input_range
whose elements are convertible to value_type
InputIt
must meet the requirements of LegacyInputIterator.
Compare
must meet the requirements of Compare.
Allocator
must meet the requirements of Allocator.
[edit] Complexity
[
first,
last)
is already sorted by value_comp().[edit] Exceptions
Calls to Allocator::allocate
may throw.
[edit] Notes
After container move construction (overload (8,9)), references, pointers, and iterators (other than the end iterator) to other 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 via LWG issue 2321.
If multiple elements in the range have keys that compare equivalent, it is unspecified which element is inserted (pending LWG2844).
Although not formally required until C++23, some implementations has already put the template parameter Allocator
into non-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) |
[edit] Example
#include <cmath> #include <iostream> #include <set> #include <string> struct Point { double x, y; }; struct PointCmp { bool operator()(const Point& lhs, const Point& rhs) const { return std::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, const auto& seq) { std::cout << rem << '{'; for (auto n{seq.size()}; const auto& elm : seq) std::cout << elm << (--n ? ", " : ""); std::cout << "}\n"; } int main() { // (1) Default constructor std::set <std::string > a; a.insert("horse"); a.insert("cat"); a.insert("dog"); println("1) a: ", a); // (4) Range constructor std::set <std::string > b(a.find("dog"), a.end()); println("2) b: ", b); // (6) Copy constructor std::set <std::string > c(a); c.insert("another horse"); println("3) c: ", c); // (8) Move constructor std::set <std::string > d(std::move(a)); println("4) d: ", d); println("5) a: ", a); // (10) Initializer list constructor std::set <std::string > e{"one", "two", "three", "five", "eight"}; println("6) e: ", e); // Custom comparison std::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 constructor const auto w = {"Eurybia", "Theia", "Rhea", "Aura", "Mnemosyne", "Mnemosyne"}; #if __cpp_lib_containers_ranges std::set <std::string > g(std::from_range, w); // overload (12) #else std::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}
[edit] Defect reports
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 required Key to be CopyInsertable into *this
|
not required |
LWG 2193 | C++11 | the default constructor was explicit | made non-explicit |