| Home | Libraries | People | FAQ | More

## Class template list

boost::container::list

## Synopsis

    // In header: <boost/container/list.hpp>

    template<typename T, typename Allocator = std::allocator<T> >
    class list {
    public:
      // types
      typedef T                                                                  value_type;
      typedef ::boost::container::allocator_traits< Allocator >::pointer         pointer;
      typedef ::boost::container::allocator_traits< Allocator >::const_pointer   const_pointer;
      typedef ::boost::container::allocator_traits< Allocator >::reference       reference;
      typedef ::boost::container::allocator_traits< Allocator >::const_reference const_reference;
      typedef ::boost::container::allocator_traits< Allocator >::size_type       size_type;
      typedef ::boost::container::allocator_traits< Allocator >::difference_type difference_type;
      typedef Allocator                                                          allocator_type;
      typedef implementation_defined                                             stored_allocator_type;
      typedef implementation_defined                                             iterator;
      typedef implementation_defined                                             const_iterator;
      typedef implementation_defined                                             reverse_iterator;
      typedef implementation_defined                                             const_reverse_iterator;

      // construct/copy/destruct
      list();
      explicit list(const allocator_type &);
      explicit list(size_type);
      list(size_type, const T &, const Allocator & = Allocator());
      list(const list &);
      list(list &&);
      list(const list &, const allocator_type &);
      list(list &&, const allocator_type &);
      template<typename InpIt> list(InpIt, InpIt, const Allocator & = Allocator());
      list& operator=(const list &);
      list& operator=(list &&);
      ~list();

      // public member functions
      void assign(size_type, const T &);
      template<typename InpIt> void assign(InpIt, InpIt);
      allocator_type get_allocator() const;
      stored_allocator_type & get_stored_allocator();
      const stored_allocator_type & get_stored_allocator() const;
      iterator begin();
      const_iterator begin() const;
      iterator end();
      const_iterator end() const;
      reverse_iterator rbegin();
      const_reverse_iterator rbegin() const;
      reverse_iterator rend();
      const_reverse_iterator rend() const;
      const_iterator cbegin() const;
      const_iterator cend() const;
      const_reverse_iterator crbegin() const;
      const_reverse_iterator crend() const;
      bool empty() const;
      size_type size() const;
      size_type max_size() const;
      void resize(size_type);
      void resize(size_type, const T &);
      reference front();
      const_reference front() const;
      reference back();
      const_reference back() const;
      template<class... Args> void emplace_back(Args &&...);
      template<class... Args> void emplace_front(Args &&...);
      template<class... Args> iterator emplace(const_iterator, Args &&...);
      void push_front(const T &);
      void push_front(T &&);
      void push_back(const T &);
      void push_back(T &&);
      iterator insert(const_iterator, const T &);
      iterator insert(const_iterator, T &&);
      iterator insert(const_iterator, size_type, const T &);
      template<typename InpIt> iterator insert(const_iterator, InpIt, InpIt);
      void pop_front();
      void pop_back();
      iterator erase(const_iterator);
      iterator erase(const_iterator, const_iterator);
      void swap(list &);
      void clear();
      void splice(const_iterator, list &);
      void splice(const_iterator, list &&);
      void splice(const_iterator, list &, const_iterator);
      void splice(const_iterator, list &&, const_iterator);
      void splice(const_iterator, list &, const_iterator, const_iterator);
      void splice(const_iterator, list &&, const_iterator, const_iterator);
      void splice(const_iterator, list &, const_iterator, const_iterator,
                  size_type);
      void splice(const_iterator, list &&, const_iterator, const_iterator,
                  size_type);
      void remove(const T &);
      template<typename Pred> void remove_if(Pred);
      void unique();
      template<typename BinaryPredicate> void unique(BinaryPredicate);
      void merge(list &);
      void merge(list &&);
      template<typename StrictWeakOrdering> void merge(list &, StrictWeakOrdering);
      template<typename StrictWeakOrdering>
        void merge(list &&, StrictWeakOrdering);
      void sort();
      template<typename StrictWeakOrdering> void sort(StrictWeakOrdering);
      void reverse();
    };

## Description

A list is a doubly linked list. That is, it is a Sequence that supports both forward and backward traversal, and (amortized) constant time insertion and removal of elements at the beginning or the end, or in the middle. Lists have the important property that insertion and splicing do not invalidate iterators to list elements, and that even removal invalidates only the iterators that point to the elements that are removed. The ordering of iterators may be changed (that is, list<T>::iterator might have a different predecessor or successor after a list operation than it did before), but the iterators themselves will not be invalidated or made to point to different elements unless that invalidation or mutation is explicit.

### `list` public construct/copy/destruct

1.     list();

   Effects: Default constructs a list.

   Throws: If allocator_type's default constructor throws.

   Complexity: Constant.

2.     explicit list(const allocator_type & a);

   Effects: Constructs a list taking the allocator as parameter.

   Throws: If allocator_type's copy constructor throws.

   Complexity: Constant.

3.     explicit list(size_type n);

   Effects: Constructs a list that will use a copy of allocator a and inserts n copies of value.

   Throws: If allocator_type's default constructor or copy constructor throws or T's default or copy constructor throws.

   Complexity: Linear to n.

4.     list(size_type n, const T & value, const Allocator & a = Allocator());

   Effects: Constructs a list that will use a copy of allocator a and inserts n copies of value.

   Throws: If allocator_type's default constructor or copy constructor throws or T's default or copy constructor throws.

   Complexity: Linear to n.

5.     list(const list & x);

   Effects: Copy constructs a list.

   Postcondition: x == *this.

   Throws: If allocator_type's default constructor or copy constructor throws.

   Complexity: Linear to the elements x contains.

6.     list(list && x);

   Effects: Move constructor. Moves mx's resources to *this.

   Throws: If allocator_type's copy constructor throws.

   Complexity: Constant.

7.     list(const list & x, const allocator_type & a);

   Effects: Copy constructs a list using the specified allocator.

   Postcondition: x == *this.

   Throws: If allocator_type's default constructor or copy constructor throws.

   Complexity: Linear to the elements x contains.

8.     list(list && x, const allocator_type & a);

   Effects: Move constructor sing the specified allocator. Moves mx's resources to *this.

   Throws: If allocation or value_type's copy constructor throws.

   Complexity: Constant if a == x.get_allocator(), linear otherwise.

9.     template<typename InpIt>
         list(InpIt first, InpIt last, const Allocator & a = Allocator());

   Effects: Constructs a list that will use a copy of allocator a and inserts a copy of the range [first, last) in the list.

   Throws: If allocator_type's default constructor or copy constructor throws or T's constructor taking an dereferenced InIt throws.

   Complexity: Linear to the range [first, last).

10.     list& operator=(const list & x);

    Effects: Makes *this contain the same elements as x.

    Postcondition: this->size() == x.size(). *this contains a copy of each of x's elements.

    Throws: If memory allocation throws or T's copy constructor throws.

    Complexity: Linear to the number of elements in x.

11.     list& operator=(list && x);

    Effects: Move assignment. All mx's values are transferred to *this.

    Postcondition: x.empty(). *this contains a the elements x had before the function.

    Throws: If allocator_type's copy constructor throws.

    Complexity: Constant.

12.     ~list();

    Effects: Destroys the list. All stored values are destroyed and used memory is deallocated.

    Throws: Nothing.

    Complexity: Linear to the number of elements.

### `list` public member functions

1.     void assign(size_type n, const T & val);

   Effects: Assigns the n copies of val to *this.

   Throws: If memory allocation throws or T's copy constructor throws.

   Complexity: Linear to n.

2.     template<typename InpIt> void assign(InpIt first, InpIt last);

   Effects: Assigns the the range [first, last) to *this.

   Throws: If memory allocation throws or T's constructor from dereferencing InpIt throws.

   Complexity: Linear to n.

3.     allocator_type get_allocator() const;

   Effects: Returns a copy of the internal allocator.

   Throws: If allocator's copy constructor throws.

   Complexity: Constant.

4.     stored_allocator_type & get_stored_allocator();

   Effects: Returns a reference to the internal allocator.

   Throws: Nothing

   Complexity: Constant.

   Note: Non-standard extension.

5.     const stored_allocator_type & get_stored_allocator() const;

   Effects: Returns a reference to the internal allocator.

   Throws: Nothing

   Complexity: Constant.

   Note: Non-standard extension.

6.     iterator begin();

   Effects: Returns an iterator to the first element contained in the list.

   Throws: Nothing.

   Complexity: Constant.

7.     const_iterator begin() const;

   Effects: Returns a const_iterator to the first element contained in the list.

   Throws: Nothing.

   Complexity: Constant.

8.     iterator end();

   Effects: Returns an iterator to the end of the list.

   Throws: Nothing.

   Complexity: Constant.

9.     const_iterator end() const;

   Effects: Returns a const_iterator to the end of the list.

   Throws: Nothing.

   Complexity: Constant.

10.     reverse_iterator rbegin();

    Effects: Returns a reverse_iterator pointing to the beginning of the reversed list.

    Throws: Nothing.

    Complexity: Constant.

11.     const_reverse_iterator rbegin() const;

    Effects: Returns a const_reverse_iterator pointing to the beginning of the reversed list.

    Throws: Nothing.

    Complexity: Constant.

12.     reverse_iterator rend();

    Effects: Returns a reverse_iterator pointing to the end of the reversed list.

    Throws: Nothing.

    Complexity: Constant.

13.     const_reverse_iterator rend() const;

    Effects: Returns a const_reverse_iterator pointing to the end of the reversed list.

    Throws: Nothing.

    Complexity: Constant.

14.     const_iterator cbegin() const;

    Effects: Returns a const_iterator to the first element contained in the list.

    Throws: Nothing.

    Complexity: Constant.

15.     const_iterator cend() const;

    Effects: Returns a const_iterator to the end of the list.

    Throws: Nothing.

    Complexity: Constant.

16.     const_reverse_iterator crbegin() const;

    Effects: Returns a const_reverse_iterator pointing to the beginning of the reversed list.

    Throws: Nothing.

    Complexity: Constant.

17.     const_reverse_iterator crend() const;

    Effects: Returns a const_reverse_iterator pointing to the end of the reversed list.

    Throws: Nothing.

    Complexity: Constant.

18.     bool empty() const;

    Effects: Returns true if the list contains no elements.

    Throws: Nothing.

    Complexity: Constant.

19.     size_type size() const;

    Effects: Returns the number of the elements contained in the list.

    Throws: Nothing.

    Complexity: Constant.

20.     size_type max_size() const;

    Effects: Returns the largest possible size of the list.

    Throws: Nothing.

    Complexity: Constant.

21.     void resize(size_type new_size);

    Effects: Inserts or erases elements at the end such that the size becomes n. New elements are default constructed.

    Throws: If memory allocation throws, or T's copy constructor throws.

    Complexity: Linear to the difference between size() and new_size.

22.     void resize(size_type new_size, const T & x);

    Effects: Inserts or erases elements at the end such that the size becomes n. New elements are copy constructed from x.

    Throws: If memory allocation throws, or T's copy constructor throws.

    Complexity: Linear to the difference between size() and new_size.

23.     reference front();

    Requires: !empty()

    Effects: Returns a reference to the first element from the beginning of the container.

    Throws: Nothing.

    Complexity: Constant.

24.     const_reference front() const;

    Requires: !empty()

    Effects: Returns a const reference to the first element from the beginning of the container.

    Throws: Nothing.

    Complexity: Constant.

25.     reference back();

    Requires: !empty()

    Effects: Returns a reference to the first element from the beginning of the container.

    Throws: Nothing.

    Complexity: Constant.

26.     const_reference back() const;

    Requires: !empty()

    Effects: Returns a const reference to the first element from the beginning of the container.

    Throws: Nothing.

    Complexity: Constant.

27.     template<class... Args> void emplace_back(Args &&... args);

    Effects: Inserts an object of type T constructed with std::forward<Args>(args)... in the end of the list.

    Throws: If memory allocation throws or T's in-place constructor throws.

    Complexity: Constant

28.     template<class... Args> void emplace_front(Args &&... args);

    Effects: Inserts an object of type T constructed with std::forward<Args>(args)... in the beginning of the list.

    Throws: If memory allocation throws or T's in-place constructor throws.

    Complexity: Constant

29.     template<class... Args> iterator emplace(const_iterator p, Args &&... args);

    Effects: Inserts an object of type T constructed with std::forward<Args>(args)... before p.

    Throws: If memory allocation throws or T's in-place constructor throws.

    Complexity: Constant

30.     void push_front(const T & x);

    Effects: Inserts a copy of x at the beginning of the list.

    Throws: If memory allocation throws or T's copy constructor throws.

    Complexity: Amortized constant time.

31.     void push_front(T && x);

    Effects: Constructs a new element in the beginning of the list and moves the resources of mx to this new element.

    Throws: If memory allocation throws.

    Complexity: Amortized constant time.

32.     void push_back(const T & x);

    Effects: Inserts a copy of x at the end of the list.

    Throws: If memory allocation throws or T's copy constructor throws.

    Complexity: Amortized constant time.

33.     void push_back(T && x);

    Effects: Constructs a new element in the end of the list and moves the resources of mx to this new element.

    Throws: If memory allocation throws.

    Complexity: Amortized constant time.

34.     iterator insert(const_iterator position, const T & x);

    Requires: position must be a valid iterator of *this.

    Effects: Insert a copy of x before position.

    Returns: an iterator to the inserted element.

    Throws: If memory allocation throws or x's copy constructor throws.

    Complexity: Amortized constant time.

35.     iterator insert(const_iterator position, T && x);

    Requires: position must be a valid iterator of *this.

    Effects: Insert a new element before position with mx's resources.

    Returns: an iterator to the inserted element.

    Throws: If memory allocation throws.

    Complexity: Amortized constant time.

36.     iterator insert(const_iterator p, size_type n, const T & x);

    Requires: p must be a valid iterator of *this.

    Effects: Inserts n copies of x before p.

    Returns: an iterator to the first inserted element or p if n is 0.

    Throws: If memory allocation throws or T's copy constructor throws.

    Complexity: Linear to n.

37.     template<typename InpIt>
          iterator insert(const_iterator p, InpIt first, InpIt last);

    Requires: p must be a valid iterator of *this.

    Effects: Insert a copy of the [first, last) range before p.

    Returns: an iterator to the first inserted element or p if first == last.

    Throws: If memory allocation throws, T's constructor from a dereferenced InpIt throws.

    Complexity: Linear to std::distance [first, last).

38.     void pop_front();

    Effects: Removes the first element from the list.

    Throws: Nothing.

    Complexity: Amortized constant time.

39.     void pop_back();

    Effects: Removes the last element from the list.

    Throws: Nothing.

    Complexity: Amortized constant time.

40.     iterator erase(const_iterator p);

    Requires: p must be a valid iterator of *this.

    Effects: Erases the element at p p.

    Throws: Nothing.

    Complexity: Amortized constant time.

41.     iterator erase(const_iterator first, const_iterator last);

    Requires: first and last must be valid iterator to elements in *this.

    Effects: Erases the elements pointed by [first, last).

    Throws: Nothing.

    Complexity: Linear to the distance between first and last.

42.     void swap(list & x);

    Effects: Swaps the contents of *this and x.

    Throws: Nothing.

    Complexity: Constant.

43.     void clear();

    Effects: Erases all the elements of the list.

    Throws: Nothing.

    Complexity: Linear to the number of elements in the list.

44.     void splice(const_iterator p, list & x);

    Requires: p must point to an element contained by the list. x != *this

    Effects: Transfers all the elements of list x to this list, before the the element pointed by p. No destructors or copy constructors are called.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Constant.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

45.     void splice(const_iterator p, list && x);

    Requires: p must point to an element contained by the list. x != *this

    Effects: Transfers all the elements of list x to this list, before the the element pointed by p. No destructors or copy constructors are called.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Constant.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

46.     void splice(const_iterator p, list & x, const_iterator i);

    Requires: p must point to an element contained by this list. i must point to an element contained in list x.

    Effects: Transfers the value pointed by i, from list x to this list, before the the element pointed by p. No destructors or copy constructors are called. If p == i or p == ++i, this function is a null operation.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Constant.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

47.     void splice(const_iterator p, list && x, const_iterator i);

    Requires: p must point to an element contained by this list. i must point to an element contained in list x.

    Effects: Transfers the value pointed by i, from list x to this list, before the the element pointed by p. No destructors or copy constructors are called. If p == i or p == ++i, this function is a null operation.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Constant.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

48.     void splice(const_iterator p, list & x, const_iterator first,
                    const_iterator last);

    Requires: p must point to an element contained by this list. first and last must point to elements contained in list x.

    Effects: Transfers the range pointed by first and last from list x to this list, before the the element pointed by p. No destructors or copy constructors are called.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Linear to the number of elements transferred.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

49.     void splice(const_iterator p, list && x, const_iterator first,
                    const_iterator last);

    Requires: p must point to an element contained by this list. first and last must point to elements contained in list x.

    Effects: Transfers the range pointed by first and last from list x to this list, before the the element pointed by p. No destructors or copy constructors are called.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Linear to the number of elements transferred.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

50.     void splice(const_iterator p, list & x, const_iterator first,
                    const_iterator last, size_type n);

    Requires: p must point to an element contained by this list. first and last must point to elements contained in list x. n == std::distance(first, last)

    Effects: Transfers the range pointed by first and last from list x to this list, before the the element pointed by p. No destructors or copy constructors are called.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Constant.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

    Note: Non-standard extension

51.     void splice(const_iterator p, list && x, const_iterator first,
                    const_iterator last, size_type n);

    Requires: p must point to an element contained by this list. first and last must point to elements contained in list x. n == std::distance(first, last)

    Effects: Transfers the range pointed by first and last from list x to this list, before the the element pointed by p. No destructors or copy constructors are called.

    Throws: std::runtime_error if this' allocator and x's allocator are not equal.

    Complexity: Constant.

    Note: Iterators of values obtained from list x now point to elements of this list. Iterators of this list and all the references are not invalidated.

    Note: Non-standard extension

52.     void remove(const T & value);

    Effects: Removes all the elements that compare equal to value.

    Throws: Nothing.

    Complexity: Linear time. It performs exactly size() comparisons for equality.

    Note: The relative order of elements that are not removed is unchanged, and iterators to elements that are not removed remain valid.

53.     template<typename Pred> void remove_if(Pred pred);

    Effects: Removes all the elements for which a specified predicate is satisfied.

    Throws: If pred throws.

    Complexity: Linear time. It performs exactly size() calls to the predicate.

    Note: The relative order of elements that are not removed is unchanged, and iterators to elements that are not removed remain valid.

54.     void unique();

    Effects: Removes adjacent duplicate elements or adjacent elements that are equal from the list.

    Throws: Nothing.

    Complexity: Linear time (size()-1 comparisons calls to pred()).

    Note: The relative order of elements that are not removed is unchanged, and iterators to elements that are not removed remain valid.

55.     template<typename BinaryPredicate> void unique(BinaryPredicate binary_pred);

    Effects: Removes adjacent duplicate elements or adjacent elements that satisfy some binary predicate from the list.

    Throws: If pred throws.

    Complexity: Linear time (size()-1 comparisons equality comparisons).

    Note: The relative order of elements that are not removed is unchanged, and iterators to elements that are not removed remain valid.

56.     void merge(list & x);

    Requires: The lists x and *this must be distinct.

    Effects: This function removes all of x's elements and inserts them in order into *this according to std::less<value_type>. The merge is stable; that is, if an element from *this is equivalent to one from x, then the element from *this will precede the one from x.

    Throws: Nothing.

    Complexity: This function is linear time: it performs at most size() + x.size() - 1 comparisons.

57.     void merge(list && x);

    Requires: The lists x and *this must be distinct.

    Effects: This function removes all of x's elements and inserts them in order into *this according to std::less<value_type>. The merge is stable; that is, if an element from *this is equivalent to one from x, then the element from *this will precede the one from x.

    Throws: Nothing.

    Complexity: This function is linear time: it performs at most size() + x.size() - 1 comparisons.

58.     template<typename StrictWeakOrdering>
          void merge(list & x, StrictWeakOrdering comp);

    Requires: p must be a comparison function that induces a strict weak ordering and both *this and x must be sorted according to that ordering The lists x and *this must be distinct.

    Effects: This function removes all of x's elements and inserts them in order into *this. The merge is stable; that is, if an element from *this is equivalent to one from x, then the element from *this will precede the one from x.

    Throws: Nothing.

    Complexity: This function is linear time: it performs at most size() + x.size() - 1 comparisons.

    Note: Iterators and references to *this are not invalidated.

59.     template<typename StrictWeakOrdering>
          void merge(list && x, StrictWeakOrdering comp);

    Requires: p must be a comparison function that induces a strict weak ordering and both *this and x must be sorted according to that ordering The lists x and *this must be distinct.

    Effects: This function removes all of x's elements and inserts them in order into *this. The merge is stable; that is, if an element from *this is equivalent to one from x, then the element from *this will precede the one from x.

    Throws: Nothing.

    Complexity: This function is linear time: it performs at most size() + x.size() - 1 comparisons.

    Note: Iterators and references to *this are not invalidated.

60.     void sort();

    Effects: This function sorts the list *this according to std::less<value_type>. The sort is stable, that is, the relative order of equivalent elements is preserved.

    Throws: Nothing.

    Notes: Iterators and references are not invalidated.

    Complexity: The number of comparisons is approximately N log N, where N is the list's size.

61.     template<typename StrictWeakOrdering> void sort(StrictWeakOrdering comp);

    Effects: This function sorts the list *this according to std::less<value_type>. The sort is stable, that is, the relative order of equivalent elements is preserved.

    Throws: Nothing.

    Notes: Iterators and references are not invalidated.

    Complexity: The number of comparisons is approximately N log N, where N is the list's size.

62.     void reverse();

    Effects: Reverses the order of elements in the list.

    Throws: Nothing.

    Complexity: This function is linear time.

    Note: Iterators and references are not invalidated