MoveAssignable
requirement for container value type overly strictSection: 23.2 [container.requirements] Status: C++11 Submitter: Howard Hinnant Opened: 2007-05-20 Last modified: 2016-01-28
Priority: Not Prioritized
View all other issues in [container.requirements].
View all issues with C++11 status.
Discussion:
The move-related changes inadvertently overwrote the intent of 276.
Issue 276 removed the requirement of CopyAssignable
from
most of the member functions of node-based containers. But the move-related changes
unnecessarily introduced the MoveAssignable
requirement for those members which used to
require CopyAssignable
.
We also discussed (c++std-lib-18722) the possibility of dropping MoveAssignable
from some of the sequence requirements. Additionally the in-place construction
work may further reduce requirements. For purposes of an easy reference, here are the
minimum sequence requirements as I currently understand them. Those items in requirements
table in the working draft which do not appear below have been purposefully omitted for
brevity as they do not have any requirements of this nature. Some items which do not
have any requirements of this nature are included below just to confirm that they were
not omitted by mistake.
X u(a) | value_type must be CopyConstructible |
X u(rv) | array requires value_type to be CopyConstructible |
a = u | Sequences require value_type to be CopyConstructible and CopyAssignable .
Associative containers require value_type to be CopyConstructible . |
a = rv | array requires value_type to be CopyAssignable .
Sequences containers with propagate_on_container_move_assignment == false allocators require value_type to be MoveConstructible and MoveAssignable .
Associative containers with propagate_on_container_move_assignment == false allocators require value_type to be MoveConstructible . |
swap(a,u) | array requires value_type to be Swappable . |
X(n) | value_type must be DefaultConstructible |
X(n, t) | value_type must be CopyConstructible |
X(i, j) | Sequences require value_type to be constructible from *i . Additionally if input_iterators
are used, vector and deque require MoveContructible and MoveAssignable . |
a.insert(p, t) | The value_type must be CopyConstructible .
The sequences vector and deque also require the value_type to be CopyAssignable . |
a.insert(p, rv) | The value_type must be MoveConstructible .
The sequences vector and deque also require the value_type to be MoveAssignable . |
a.insert(p, n, t) | The value_type must be CopyConstructible .
The sequences vector and deque also require the value_type to be CopyAssignable . |
a.insert(p, i, j) | If the iterators return an lvalue the value_type must be CopyConstructible .
The sequences vector and deque also require the value_type to be CopyAssignable when the iterators return an lvalue.
If the iterators return an rvalue the value_type must be MoveConstructible .
The sequences vector and deque also require the value_type to be MoveAssignable when the iterators return an rvalue. |
a.erase(p) | The sequences vector and deque require the value_type to be MoveAssignable . |
a.erase(q1, q2) | The sequences vector and deque require the value_type to be MoveAssignable . |
a.clear() | |
a.assign(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible and CopyAssignable .
If the iterators return an rvalue the value_type must be MoveConstructible and MoveAssignable . |
a.assign(n, t) | The value_type must be CopyConstructible and CopyAssignable . |
a.resize(n) | The value_type must be DefaultConstructible .
The sequence vector also requires the value_type to be MoveConstructible . |
a.resize(n, t) | The value_type must be CopyConstructible . |
a.front() | |
a.back() | |
a.push_front(t) | The value_type must be CopyConstructible . |
a.push_front(rv) | The value_type must be MoveConstructible . |
a.push_back(t) | The value_type must be CopyConstructible . |
a.push_back(rv) | The value_type must be MoveConstructible . |
a.pop_front() | |
a.pop_back() | |
a[n] | |
a.at[n] |
X(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible .
If the iterators return an rvalue the value_type must be MoveConstructible . |
a_uniq.insert(t) | The value_type must be CopyConstructible . |
a_uniq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible . |
a_eq.insert(t) | The value_type must be CopyConstructible . |
a_eq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible . |
a.insert(p, t) | The value_type must be CopyConstructible . |
a.insert(p, rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible . |
a.insert(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible .
If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible .. |
X(i, j, n, hf, eq) | If the iterators return an lvalue the value_type must be CopyConstructible .
If the iterators return an rvalue the value_type must be MoveConstructible . |
a_uniq.insert(t) | The value_type must be CopyConstructible . |
a_uniq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible . |
a_eq.insert(t) | The value_type must be CopyConstructible . |
a_eq.insert(rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible . |
a.insert(p, t) | The value_type must be CopyConstructible . |
a.insert(p, rv) | The key_type and the mapped_type (if it exists) must be MoveConstructible . |
a.insert(i, j) | If the iterators return an lvalue the value_type must be CopyConstructible .
If the iterators return an rvalue the key_type and the mapped_type (if it exists) must be MoveConstructible .. |
map[lvalue-key] | The key_type must be CopyConstructible .
The mapped_type must be DefaultConstructible and MoveConstructible . |
map[rvalue-key] | The key_type must be MoveConstructible .
The mapped_type must be DefaultConstructible and MoveConstructible . |
[ Kona (2007): Howard and Alan to update requirements table in issue with emplace signatures. ]
[ Bellevue: This should be handled as part of the concepts work. ]
[ 2009-07-20 Reopened by Howard: ]
This is one of the issues that was "solved by concepts" and is now no longer solved.
In a nutshell, concepts adopted the "minimum requirements" philosophy outlined in the discussion of this issue, and enforced it. My strong suggestion is that we translate the concepts specification into documentation for the containers.
What this means for vendors is that they will have to implement container members being careful to only use those characteristics of a type that the concepts specification formally allowed. Note that I am not talking about
enable_if
'ing everything. I am simply suggesting that (for example) we tell the vendor he can't callT's
copy constructor or move constructor within theemplace
member function, etc.What this means for customers is that they will be able to use types within C++03 containers which are sometimes not CopyConstructible, and sometimes not even MoveConstructible, etc.
[ 2009-10 Santa Cruz: ]
Leave open. Howard to provide wording.
[ 2010-02-06 Howard provides wording. ]
[ 2010-02-08 Moved to Tentatively Ready after 5 positive votes on c++std-lib. ]
[ 2010-02-10 Howard opened. I neglected to reduce the requirements on value_type for the insert function of the ordered and unordered associative containers when the argument is an rvalue. Fixed it. ]
[ 2010-02-11 Moved to Tentatively Ready after 5 positive votes on c++std-lib. ]
[ 2010-03-08 Nico opens: ]
I took the task to see whether 868 is covered by 704 already. However, by doing that I have the impression that 704 is a big mistake.
Take e.g. the second change of 868:
Change 23.3.5.2 [deque.cons] para 5:
Effects: Constructs a
deque
withn
default constructed elements.where "default constructed" should be replaced by "value-initialized". This is the constructor out of a number of elements:
ContType c(num)704 says:
Remove the entire section 23.3.5.2 [deque.cons].
[ This section is already specified by the requirements tables. ]
BUT, there is no requirement table that lists this constructor at all, which means that we would lose the entire specification of this function !!!
In fact, I found with further investigation, if we follow 704 to remove 23.3.2.1 we
- have no semantics for
ContType c(num)
- have no complexity and no allocator specification for
ContType c(num,val)
- have no semantics for
ContType c(num,val,alloc)
- - have no complexity and no allocator specification for
ContType c(beg,end)
- - have no semantics for
ContType c(beg,end,alloc)
- - have different wording (which might or might not give the same guarantees) for the
assign
functionsbecause all these guarantees are given in the removed section but nowhere else (as far as I saw).
Looks to me that 704 need a significant review before we take that change, because chances are high that there are similar flaws in other proposed changes there (provided I am not missing anything).
[ 2010 Pittsburgh: ]
Removed the parts from the proposed wording that removed existing sections, and set to Ready for Pittsburgh.
Rationale:
[ post San Francisco: ]
Solved by N2776.
This rationale is obsolete.
Proposed resolution:
Change 23.2.2 [container.requirements.general]/4:
4 In Tables 91 and 92,
X
denotes a container class containing objects of typeT
,a
andb
denote values of typeX
,u
denotes an identifier,r
denotesan lvalue or a const rvaluea non-const value of typeX
, andrv
denotes a non-const rvalue of typeX
.
Change the following rows in Table 91 — Container requirements 23.2.2 [container.requirements.general]:
Table 91 — Container requirements Expression Return type Assertion/note
pre-/post-conditionComplexity X::value_type
T
Requires: T
isDestructible
.compile time
Change 23.2.2 [container.requirements.general]/10:
Unless otherwise specified (see 23.2.4.1, 23.2.5.1, 23.3.2.3, and 23.3.6.4) all container types defined in this Clause meet the following additional requirements:
…
no
erase()
,clear()
,pop_back()
orpop_front()
function throws an exception.…
Insert a new paragraph prior to 23.2.2 [container.requirements.general]/14:
The descriptions of the requirements of the type
T
in this section use the termsCopyConstructible
,MoveConstructible
, constructible from*i
, and constructible fromargs
. These terms are equivalent to the following expression using the appropriate arguments:allocator_traits<allocator_type>::construct(x.get_allocator(), q, args...);where
x
is a non-const lvalue of some container typeX
andq
has typeX::value_type*
.[Example: The container is going to move construct a
T
, so will call:allocator_traits<allocator_type>::construct(get_allocator(), q, std::move(t));The default implementation of construct will call:
::new (q) T(std::forward<T>(t)); // where forward is the same as move here, cast to rvalueBut the allocator author may override the above definition of
construct
and do the construction ofT
by some other means. — end example]14 ...
Add to 23.2.2 [container.requirements.general]/14:
14 In Table 93,
X
denotes an allocator-aware container class with avalue_type
ofT
using allocator of typeA
,u
denotes a variable,a
andb
denote non-const lvalues of typeX
,t
denotes an lvalue or a const rvalue of typeX
,rv
denotes a non-const rvalue of typeX
,m
is a value of typeA
, andQ
is an allocator type.
Change or add the following rows in Table 93 — Allocator-aware container requirements in 23.2.2 [container.requirements.general]:
Table 93 — Allocator-aware container requirements Expression Return type Assertion/note
pre-/post-conditionComplexity X(t, m)
X u(t, m);Requires: T
isCopyConstructible
.
post:u == t
,
get_allocator() == m
linear X(rv, m)
X u(rv, m);Requires: T
isMoveConstructible
.
post:u
shall have the same elements, or copies of the elements, thatrv
had before this construction,
get_allocator() == m
constant if m == rv.get_allocator()
, otherwise lineara = t
X&
Requires: T
isCopyConstructible
andCopyAssignable
post:a == t
.linear a = rv
X&
Requires: If allocator_traits< allocator_type > ::propagate_on_container_move_assignment ::value
isfalse
,T
isMoveConstructible
andMoveAssignable
.
All existing elements ofa
are either move assigned to or destroyed.
a
shall be equal to the value thatrv
had before this assignmentlinear a.swap(b);
void
exchanges the contents of a
andb
constant
Change the following rows in Table 94 — Sequence container requirements (in addition to container) in 23.2.4 [sequence.reqmts]:
Table 94 — Sequence container requirements (in addition to container) Expression Return type Assertion/note
pre-/post-conditionX(i, j)
X a(i, j)Requires: If the iterator's dereference operation returns an lvalue or a const rvalue,T
shall beCopyConstructible
.T
shall be constructible from*i
.
If the iterator does not meet the forward iterator requirements (24.3.5.5 [forward.iterators]), thenvector
also requiresT
to beMoveConstructible
.
Each iterator in the range[i,j)
shall be dereferenced exactly once.
post:size() ==
distance betweeni
andj
Constructs a sequence container equal to the range[i, j)
a = il;
X&
Requires: T
isCopyConstructible
andCopyAssignable
.
a = X(il);
Assigns the range[il.begin(), il.end())
intoa
. All existing elements ofa
are either assigned or destroyed.
rReturns*this;
a.emplace(p, args);
iterator
Requires: ConstructibleAsElement<A, T, Args>
.T
is constructible fromargs
.vector
anddeque
also requireT
to beMoveConstructible
andMoveAssignable
. Inserts an object of typeT
constructed withstd::forward<Args>(args)...
beforep
.a.insert(p, t);
iterator
Requires: ConstructibleAsElement<A, T, Args>
andT
shall beCopyAssignable
.T
shall beCopyConstructible
.vector
anddeque
also requireT
to beCopyAssignable
. Inserts a copyt
beforep
.a.insert(p, rv);
iterator
Requires: ConstructibleAsElement<A, T, T&&>
andT
shall beMoveAssignable
.T
shall beMoveConstructible
.vector
anddeque
also requireT
to beMoveAssignable
. Inserts a copyrv
beforep
.a.insert(p, i, j)
iterator
Requires: If the iterator's dereference operation returns an lvalue or a const rvalue,T
shall beCopyConstructible
.T
shall be constructible from*i
.
If the iterator does not meet the forward iterator requirements (24.3.5.5 [forward.iterators]), thenvector
also requiresT
to beMoveConstructible
andMoveAssignable
.
Each iterator in the range[i,j)
shall be dereferenced exactly once.
pre:i
andj
are not iterators intoa
.
Inserts copies of elements in[i, j)
beforep
a.erase(q);
iterator
Requires: T
andT
shall beMoveAssignable
.vector
anddeque
requireT
to beMoveAssignable
. Erases the element pointed to byq
.a.erase(q1, q2);
iterator
Requires: T
andT
shall beMoveAssignable
.vector
anddeque
requireT
to beMoveAssignable
. Erases the elements in the range[q1, q2)
.a.clear();
void
erase(begin(), end())
Destroys all elements ina
. Invalidates all references, pointers, and iterators referring to the elements ofa
and may invalidate the past-the-end iterator.
post:
size() == 0a.empty() == truea.assign(i, j)
void
Requires: If the iterator's dereference operation returns an lvalue or a const rvalue,T
shall beCopyConstructible
andCopyAssignable
.T
shall be constructible and assignable from*i
. If the iterator does not meet the forward iterator requirements (24.3.5.5 [forward.iterators]), thenvector
also requiresT
to beMoveConstructible
.
Each iterator in the range[i,j)
shall be dereferenced exactly once.
pre:i
,j
are not iterators intoa
.
Replaces elements ina
with a copy of[i, j)
.
Change the following rows in Table 95 — Optional sequence container operations in 23.2.4 [sequence.reqmts]:
Table 95 — Optional sequence container operations Expression Return type Operational semantics Container a.emplace_front(args)
void
a.emplace(a.begin(), std::forward<Args>(args)...)
Prepends an object of typeT
constructed withstd::forward<Args>(args)...
.
Requires:ConstructibleAsElement<A, T, Args>
T
shall be constructible fromargs
.list
,deque
,forward_list
a.emplace_back(args)
void
a.emplace(a.end(), std::forward<Args>(args)...)
Appends an object of typeT
constructed withstd::forward<Args>(args)...
.
Requires:ConstructibleAsElement<A, T, Args>
T
shall be constructible fromargs
.vector
also requiresT
to beMoveConstructible
.list
,deque
,vector
a.push_front(t)
void
a.insert(a.begin(), t)
Prepends a copy oft
.
Requires:ConstructibleAsElement<A, T, T>
andT
shall beCopyAssignable
.T
shall beCopyConstructible
.list
,deque
,forward_list
a.push_front(rv)
void
a.insert(a.begin(), t)
Prepends a copy ofrv
.
Requires:ConstructibleAsElement<A, T, T&&>
andT
shall beMoveAssignable
.T
shall beMoveConstructible
.list
,deque
,forward_list
a.push_back(t)
void
a.insert(a.end(), t)
Appends a copy oft
.
Requires:ConstructibleAsElement<A, T, T>
andT
shall beCopyAssignable
.T
shall beCopyConstructible
.vector
,list
,deque
,basic_string
a.push_back(rv)
void
a.insert(a.end(), t)
Appends a copy ofrv
.
Requires:ConstructibleAsElement<A, T, T&&>
andT
shall beMoveAssignable
.T
shall beMoveConstructible
.vector
,list
,deque
,basic_string
a.pop_front()
void
a.erase(a.begin())
Destroys the first element.
Requires:a.empty()
shall befalse
.list
,deque
,forward_list
a.pop_back()
void
{ iterator tmp = a.end();
--tmp;
a.erase(tmp); }
Destroys the last element.
Requires:a.empty()
shall befalse
.vector
,list
,deque
,basic_string
Insert a new paragraph prior to 23.2.7 [associative.reqmts]/7, and edit paragraph 7:
The associative containers meet all of the requirements of Allocator-aware containers (23.2.2 [container.requirements.general]), except for the containers
map
andmultimap
, the requirements placed onvalue_type
in Table 93 apply instead directly tokey_type
andmapped_type
. [Note: For examplekey_type
andmapped_type
are sometimes required to beCopyAssignable
even though thevalue_type
(pair<const key_type, mapped_type>
) is notCopyAssignable
. — end note]7 In Table 96,
X
denotes an associative container class, a denotes a value ofX
,a_uniq
denotes a value ofX
whenX
supports unique keys,a_eq
denotes a value ofX
whenX
supports multiple keys,u
denotes an identifier,r
denotes an lvalue or a const rvalue of typeX
,rv
denotes a non-const rvalue of typeX
,i
andj
satisfy input iterator requirements and refer to elements implicitly convertible tovalue_type
,[i,j)
denotes a valid range,p
denotes a valid const iterator toa
,q
denotes a valid dereferenceable const iterator toa
,[q1, q2)
denotes a valid range of const iterators ina
,il
designates an object of typeinitializer_list<value_type>
,t
denotes a value ofX::value_type
,k
denotes a value ofX::key_type
andc
denotes a value of typeX::key_compare
.A
denotes the storage allocator used byX
, if any, orstd::allocator<X::value_type>
otherwise, andm
denotes an allocator of a type convertible toA
.
Change or add the following rows in Table 96 — Associative container requirements (in addition to container) in 23.2.7 [associative.reqmts]:
Table 96 — Associative container requirements (in addition to container) Expression Return type Assertion/note
pre-/post-conditionComplexity X::key_type
Key
Requires: Key
isCopyConstructible
andCopyAssignable
Destructible
compile time X::mapped_type
(map
andmultimap
only)T
Requires: T
isDestructible
compile time X(c)
X a(c);Requires: .ConstructibleAsElement<A, key_compare, key_compare>
key_compare
isCopyConstructible
.
Constructs an empty container.
Uses a copy ofc
as a comparison object.constant X()
X a;Requires: .ConstructibleAsElement<A, key_compare, key_compare>
key_compare
isDefaultConstructible
.
Constructs an empty container.
UsesCompare()
as a comparison object.constant X(i, j, c)
X a(i, j, c);Requires: .ConstructibleAsElement<A, key_compare, key_compare>
key_compare
isCopyConstructible
.value_type
shall be constructible from*i
.
Constructs an empty container ans inserts elements from the range[i, j)
into it; usesc
as a comparison object.N
logN
in general (N
is the distance fromi
toj
); linear if[i, j)
is sorted withvalue_comp()
X(i, j)
X a(i, j);Requires: .ConstructibleAsElement<A, key_compare, key_compare>
value_type
shall be constructible from*i
.key_compare
isDefaultConstructible
.
Same as above, but usesCompare()
as a comparison object.same as above a = il
X&
a = X(il);
return *this;
Requires:T
isCopyConstructible
andCopyAssignable
.
Assigns the range[il.begin(), il.end())
intoa
. All existing elements ofa
are either assigned or destroyed.Same as.
a = X(il)
N
logN
in general (N
isil.size()
added to the existing size ofa
); linear if[il.begin(), il.end())
is sorted withvalue_comp()
a_uniq.emplace(args)
pair<iterator, bool>
Requires: T
shall be constructible fromargs
inserts aT
objectt
constructed withstd::forward<Args>(args)...
if and only if there is no element in the container with key equivalent to the key oft
. Thebool
component of the returned pair is true if and only if the insertion takes place, and the iterator component of the pair points to the element with key equivalent to the key oft
.logarithmic a_eq.emplace(args)
iterator
Requires: T
shall be constructible fromargs
inserts aT
objectt
constructed withstd::forward<Args>(args)...
and returns the iterator pointing to the newly inserted element.logarithmic a_uniq.insert(t)
pair<iterator, bool>
Requires: T
shall beMoveConstructible
ift
is a non-const rvalue expression, elseT
shall beCopyConstructible
.
insertst
if and only if there is no element in the container with key equivalent to the key oft
. Thebool
component of the returned pair is true if and only if the insertion takes place, and the iterator component of the pair points to the element with key equivalent to the key oft
.logarithmic a_eq.insert(t)
iterator
Requires: T
shall beMoveConstructible
ift
is a non-const rvalue expression, elseT
shall beCopyConstructible
.
insertst
and returns the iterator pointing to the newly inserted element. If a range containing elements equivalent tot
exists ina_eq
,t
is inserted at the end of that range.logarithmic a.insert(p, t)
iterator
Requires: T
shall beMoveConstructible
ift
is a non-const rvalue expression, elseT
shall beCopyConstructible
.
insertst
if and only if there is no element with key equivalent to the key oft
in containers with unique keys; always insertst
in containers with equivalent keys; always returns the iterator pointing to the element with key equivalent to the key oft
.t
is inserted as close as possible to the position just prior top
.logarithmic in general, but amortized constant if t
is inserted right beforep
.a.insert(i, j)
void
Requires: T
shall be constructible from*i
.
pre:i
,j
are not iterators intoa
. inserts each element from the range[i,j)
if and only if there is no element with key equivalent to the key of that element in containers with unique keys; always inserts that element in containers with equivalent keys.N log(size() + N ) (N is the distance from i to j)
Insert a new paragraph prior to 23.2.8 [unord.req]/9:
The unordered associative containers meet all of the requirements of Allocator-aware containers (23.2.2 [container.requirements.general]), except for the containers
unordered_map
andunordered_multimap
, the requirements placed onvalue_type
in Table 93 apply instead directly tokey_type
andmapped_type
. [Note: For examplekey_type
andmapped_type
are sometimes required to beCopyAssignable
even though thevalue_type
(pair<const key_type, mapped_type>
) is notCopyAssignable
. — end note]9 ...
Change or add the following rows in Table 98 — Unordered associative container requirements (in addition to container) in 23.2.8 [unord.req]:
Table 98 — Unordered associative container requirements (in addition to container) Expression Return type Assertion/note
pre-/post-conditionComplexity X::key_type
Key
Requires: Key
shall beCopyAssignable
andCopyConstructible
Destructible
compile time X::mapped_type
(unordered_map
andunordered_multimap
only)T
Requires: T
isDestructible
compile time X(n, hf, eq)
X a(n, hf, eq)X
Requires: hasher
andkey_equal
areCopyConstructible
. Constructs an empty container with at leastn
buckets, usinghf
as the hash function andeq
as the key equality predicate.O(N)
X(n, hf)
X a(n, hf)X
Requires: hasher
isCopyConstructible
andkey_equal
isDefaultConstructible
. Constructs an empty container with at leastn
buckets, usinghf
as the hash function andkey_equal()
as the key equality predicate.O(N)
X(n)
X a(n)X
Requires: hasher
andkey_equal
areDefaultConstructible
. Constructs an empty container with at leastn
buckets, usinghasher()
as the hash function andkey_equal()
as the key equality predicate.O(N)
X()
X aX
Requires: hasher
andkey_equal
areDefaultConstructible
. Constructs an empty container an unspecified number of buckets, usinghasher()
as the hash function andkey_equal()
as the key equality predicate.constant X(i, j, n, hf, eq)
X a(i, j, n, hf, eq)X
Requires: value_type
is constructible from*i
.hasher
andkey_equal
areCopyConstructible
.
Constructs an empty container with at leastn
buckets, usinghf
as the hash function andeq
as the key equality predicate, and inserts elements from[i, j)
into it.Average case O(N)
(N
isdistance(i, j)
), worst caseO(N2)
X(i, j, n, hf)
X a(i, j, n, hf)X
Requires: value_type
is constructible from*i
.hasher
isCopyConstructible
andkey_equal
isDefaultConstructible
.
Constructs an empty container with at leastn
buckets, usinghf
as the hash function andkey_equal()
as the key equality predicate, and inserts elements from[i, j)
into it.Average case O(N)
(N
isdistance(i, j)
), worst caseO(N2)
X(i, j, n)
X a(i, j, n)X
Requires: value_type
is constructible from*i
.hasher
andkey_equal
areDefaultConstructible
.
Constructs an empty container with at leastn
buckets, usinghasher()
as the hash function andkey_equal()
as the key equality predicate, and inserts elements from[i, j)
into it.Average case O(N)
(N
isdistance(i, j)
), worst caseO(N2)
X(i, j)
X a(i, j)X
Requires: value_type
is constructible from*i
.hasher
andkey_equal
areDefaultConstructible
.
Constructs an empty container with an unspecified number of buckets, usinghasher()
as the hash function andkey_equal()
as the key equality predicate, and inserts elements from[i, j)
into it.Average case O(N)
(N
isdistance(i, j)
), worst caseO(N2)
X(b)
X a(b)X
Copy constructor. In addition to the contained elementsrequirements of Table 93 (23.2.2 [container.requirements.general]), copies the hash function, predicate, and maximum load factor.Average case linear in b.size()
, worst case quadratic.a = b
X&
Copy assignment operator. In addition to the contained elementsrequirements of Table 93 (23.2.2 [container.requirements.general]), copies the hash function, predicate, and maximum load factor.Average case linear in b.size()
, worst case quadratic.a = il
X&
a = X(il); return *this;
Requires:T
isCopyConstructible
andCopyAssignable
.
Assigns the range[il.begin(), il.end())
intoa
. All existing elements ofa
are either assigned or destroyed.Average case linear in il.size()
, worst case quadratic.a_uniq.emplace(args)
pair<iterator, bool>
Requires: T
shall be constructible fromargs
inserts aT
objectt
constructed withstd::forward<Args>(args)...
if and only if there is no element in the container with key equivalent to the key oft
. Thebool
component of the returned pair is true if and only if the insertion takes place, and the iterator component of the pair points to the element with key equivalent to the key oft
.Average case O(1), worst case O( a_uniq.size()
).a_eq.emplace(args)
iterator
Requires: T
shall be constructible fromargs
inserts aT
objectt
constructed withstd::forward<Args>(args)...
and returns the iterator pointing to the newly inserted element.Average case O(1), worst case O( a_eq.size()
).a.emplace_hint(p, args)
iterator
Requires: T
shall be constructible fromargs
equivalent toa.emplace( std::forward<Args>(args)...)
. Return value is an iterator pointing to the element with the key equivalent to the newly inserted element. Theconst_iterator p
is a hint pointing to where the search should start. Implementations are permitted to ignore the hint.Average case O(1), worst case O( a.size()
).a_uniq.insert(t)
pair<iterator, bool>
Requires: T
shall beMoveConstructible
ift
is a non-const rvalue expression, elseT
shall beCopyConstructible
.
Insertst
if and only if there is no element in the container with key equivalent to the key oft
. Thebool
component of the returned pair indicates whether the insertion takes place, and the iterator component points to the element with key equivalent to the key oft
.Average case O(1), worst case O( a_uniq.size()
).a_eq.insert(t)
iterator
Requires: T
shall beMoveConstructible
ift
is a non-const rvalue expression, elseT
shall beCopyConstructible
.
Insertst
, and returns an iterator pointing to the newly inserted element.Average case O(1), worst case O( a_uniq.size()
).a.insert(q, t)
iterator
Requires: T
shall beMoveConstructible
ift
is a non-const rvalue expression, elseT
shall beCopyConstructible
.
Equivalent toa.insert(t)
. Return value is an iterator pointing to the element with the key equivalent to that oft
. The iteratorq
is a hint pointing to where the search should start. Implementations are permitted to ignore the hint.Average case O(1), worst case O( a_uniq.size()
).a.insert(i, j)
void
Requires: T
shall be constructible from*i
.
Pre:i
andj
are not iterators ina
. Equivalent toa.insert(t)
for each element in[i,j)
.Average case O( N
), whereN
isdistance(i, j)
. Worst case O(N * a.size()
).
Change [forwardlist]/2:
2 A
forward_list
satisfies all of the requirements of a container (table 91), except that thesize()
member function is not provided. Aforward_list
also satisfies all of the requirements of an allocator-aware container (table 93). Andforward_list
provides theassign
member functions as specified in Table 94, Sequence container requirements, and several of the optional sequence container requirements (Table 95). Descriptions are provided here only for operations onforward_list
that are not described in that table or for operations where there is additional semantic information.
Add a new paragraph after [forwardlist.modifiers]/23:
void clear();23 Effects: Erases all elements in the range
[begin(),end())
.Remarks: Does not invalidate past-the-end iterators.
Change 23.3.11.3 [vector.capacity]/13:
void resize(size_type sz, const T& c);13 Requires:
T
shall beCopyConstructible
. Ifvalue_type
has a move constructor, that constructor shall not throw any exceptions.
In 23.5.6 [unord.set] and 23.5.7 [unord.multiset] substitute
"Key
" for "Value
".
[ The above substitution is normative as it ties into the requirements table. ]