Files
2025-10-25 03:02:53 +03:00

12 KiB

[list.ops]

23 Containers library [containers]

23.3 Sequence containers [sequences]

23.3.11 Class template list [list]

23.3.11.5 Operations [list.ops]

1

#

Since lists allow fast insertion and erasing from the middle of a list, certain operations are provided specifically for them.196

In this subclause, arguments for a template parameter named Predicate or BinaryPredicate shall meet the corresponding requirements in [algorithms.requirements].

The semantics of i + n and i - n, where i is an iterator into the list and n is an integer, are the same as those of next(i, n) and prev(i, n), respectively.

For merge and sort, the definitions and requirements in [alg.sorting] apply.

2

#

list provides three splice operations that destructively move elements from one list to another.

The behavior of splice operations is undefined if get_allocator() != x.get_allocator().

🔗

constexpr void splice(const_iterator position, list& x); constexpr void splice(const_iterator position, list&& x);

3

#

Preconditions: addressof(x) != this is true.

4

#

Effects: Inserts the contents ofx beforeposition andx becomes empty.

Pointers and references to the moved elements ofx now refer to those same elements but as members of*this.

Iterators referring to the moved elements will continue to refer to their elements, but they now behave as iterators into*this, not intox.

5

#

Throws: Nothing.

6

#

Complexity: Constant time.

🔗

constexpr void splice(const_iterator position, list& x, const_iterator i); constexpr void splice(const_iterator position, list&& x, const_iterator i);

7

#

Preconditions: i is a valid dereferenceable iterator of x.

8

#

Effects: Inserts an element pointed to byi from listx before position and removes the element fromx.

The result is unchanged ifposition == i orposition == ++i.

Pointers and references toi continue to refer to this same element but as a member ofthis.

Iterators toi (includingi itself) continue to refer to the same element, but now behave as iterators intothis, not intox.

9

#

Throws: Nothing.

10

#

Complexity: Constant time.

🔗

constexpr void splice(const_iterator position, list& x, const_iterator first, const_iterator last); constexpr void splice(const_iterator position, list&& x, const_iterator first, const_iterator last);

11

#

Preconditions: [first, last) is a valid range in x.

position is not an iterator in the range [first, last).

12

#

Effects: Inserts elements in the range [first, last) beforeposition and removes the elements fromx.

Pointers and references to the moved elements ofx now refer to those same elements but as members of*this.

Iterators referring to the moved elements will continue to refer to their elements, but they now behave as iterators into*this, not intox.

13

#

Throws: Nothing.

14

#

Complexity: Constant time ifaddressof(x) == this; otherwise, linear time.

🔗

constexpr size_type remove(const T& value); template<class Predicate> constexpr size_type remove_if(Predicate pred);

15

#

Effects: Erases all the elements in the list referred to by a list iterator i for which the following conditions hold: *i == value, pred(*i) != false.

Invalidates only the iterators and references to the erased elements.

16

#

Returns: The number of elements erased.

17

#

Throws: Nothing unless an exception is thrown by*i == value orpred(*i) != false.

18

#

Complexity: Exactlysize() applications of the corresponding predicate.

19

#

Remarks: Stable.

🔗

constexpr size_type unique(); template<class BinaryPredicate> constexpr size_type unique(BinaryPredicate binary_pred);

20

#

Let binary_pred be equal_to<>{} for the first overload.

21

#

Preconditions: binary_pred is an equivalence relation.

22

#

Effects: Erases all but the first element from every consecutive group of equivalent elements.

That is, for a nonempty list, erases all elements referred to by the iterator i in the range [begin() + 1, end()) for which binary_pred(*i, *(i - 1)) is true.

Invalidates only the iterators and references to the erased elements.

23

#

Returns: The number of elements erased.

24

#

Throws: Nothing unless an exception is thrown by the predicate.

25

#

Complexity: If empty() is false, exactly size() - 1 applications of the corresponding predicate, otherwise no applications of the predicate.

🔗

constexpr void merge(list& x); constexpr void merge(list&& x); template<class Compare> constexpr void merge(list& x, Compare comp); template<class Compare> constexpr void merge(list&& x, Compare comp);

26

#

Let comp be less<> for the first two overloads.

27

#

Preconditions: *this and x are both sorted with respect to the comparator comp, andget_allocator() == x.get_allocator() is true.

28

#

Effects: If addressof(x) == this, there are no effects.

Otherwise, merges the two sorted ranges [begin(), end()) and [x.begin(), x.end()).

The result is a range that is sorted with respect to the comparator comp.

Pointers and references to the moved elements of x now refer to those same elements but as members of *this.

Iterators referring to the moved elements will continue to refer to their elements, but they now behave as iterators into *this, not intox.

29

#

Complexity: At most size() + x.size() - 1 comparisons if addressof(x) != this; otherwise, no comparisons are performed.

30

#

Remarks: Stable ([algorithm.stable]).

If addressof(x) != this, x is empty after the merge.

No elements are copied by this operation.

If an exception is thrown other than by a comparison, there are no effects.

🔗

constexpr void reverse() noexcept;

31

#

Effects: Reverses the order of the elements in the list.

Does not affect the validity of iterators and references.

32

#

Complexity: Linear time.

🔗

void sort(); template<class Compare> void sort(Compare comp);

33

#

Effects: Sorts the list according to the operator< or a Compare function object.

If an exception is thrown, the order of the elements in *this is unspecified.

Does not affect the validity of iterators and references.

34

#

Complexity: ApproximatelyNlogN comparisons, where N is size().

35

#

Remarks: Stable.

196)196)

As specified in [allocator.requirements], the requirements in this Clause apply only to lists whose allocators compare equal.