📄 stl_deque.h
字号:
// iterators /** * Returns a read/write iterator that points to the first element in the * %deque. Iteration is done in ordinary element order. */ iterator begin() { return this->_M_impl._M_start; } /** * Returns a read-only (constant) iterator that points to the first * element in the %deque. Iteration is done in ordinary element order. */ const_iterator begin() const { return this->_M_impl._M_start; } /** * Returns a read/write iterator that points one past the last element in * the %deque. Iteration is done in ordinary element order. */ iterator end() { return this->_M_impl._M_finish; } /** * Returns a read-only (constant) iterator that points one past the last * element in the %deque. Iteration is done in ordinary element order. */ const_iterator end() const { return this->_M_impl._M_finish; } /** * Returns a read/write reverse iterator that points to the last element * in the %deque. Iteration is done in reverse element order. */ reverse_iterator rbegin() { return reverse_iterator(this->_M_impl._M_finish); } /** * Returns a read-only (constant) reverse iterator that points to the * last element in the %deque. Iteration is done in reverse element * order. */ const_reverse_iterator rbegin() const { return const_reverse_iterator(this->_M_impl._M_finish); } /** * Returns a read/write reverse iterator that points to one before the * first element in the %deque. Iteration is done in reverse element * order. */ reverse_iterator rend() { return reverse_iterator(this->_M_impl._M_start); } /** * Returns a read-only (constant) reverse iterator that points to one * before the first element in the %deque. Iteration is done in reverse * element order. */ const_reverse_iterator rend() const { return const_reverse_iterator(this->_M_impl._M_start); } // [23.2.1.2] capacity /** Returns the number of elements in the %deque. */ size_type size() const { return this->_M_impl._M_finish - this->_M_impl._M_start; } /** Returns the size() of the largest possible %deque. */ size_type max_size() const { return size_type(-1); } /** * @brief Resizes the %deque to the specified number of elements. * @param new_size Number of elements the %deque should contain. * @param x Data with which new elements should be populated. * * This function will %resize the %deque to the specified number of * elements. If the number is smaller than the %deque's current size the * %deque is truncated, otherwise the %deque is extended and new elements * are populated with given data. */ void resize(size_type __new_size, const value_type& __x) { const size_type __len = size(); if (__new_size < __len) erase(this->_M_impl._M_start + __new_size, this->_M_impl._M_finish); else insert(this->_M_impl._M_finish, __new_size - __len, __x); } /** * @brief Resizes the %deque to the specified number of elements. * @param new_size Number of elements the %deque should contain. * * This function will resize the %deque to the specified number of * elements. If the number is smaller than the %deque's current size the * %deque is truncated, otherwise the %deque is extended and new elements * are default-constructed. */ void resize(size_type new_size) { resize(new_size, value_type()); } /** * Returns true if the %deque is empty. (Thus begin() would equal end().) */ bool empty() const { return this->_M_impl._M_finish == this->_M_impl._M_start; } // element access /** * @brief Subscript access to the data contained in the %deque. * @param n The index of the element for which data should be accessed. * @return Read/write reference to data. * * This operator allows for easy, array-style, data access. * Note that data access with this operator is unchecked and out_of_range * lookups are not defined. (For checked lookups see at().) */ reference operator[](size_type __n) { return this->_M_impl._M_start[difference_type(__n)]; } /** * @brief Subscript access to the data contained in the %deque. * @param n The index of the element for which data should be accessed. * @return Read-only (constant) reference to data. * * This operator allows for easy, array-style, data access. * Note that data access with this operator is unchecked and out_of_range * lookups are not defined. (For checked lookups see at().) */ const_reference operator[](size_type __n) const { return this->_M_impl._M_start[difference_type(__n)]; } protected: /// @if maint Safety check used only from at(). @endif void _M_range_check(size_type __n) const { if (__n >= this->size()) __throw_out_of_range(__N("deque::_M_range_check")); } public: /** * @brief Provides access to the data contained in the %deque. * @param n The index of the element for which data should be accessed. * @return Read/write reference to data. * @throw std::out_of_range If @a n is an invalid index. * * This function provides for safer data access. The parameter is first * checked that it is in the range of the deque. The function throws * out_of_range if the check fails. */ reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; } /** * @brief Provides access to the data contained in the %deque. * @param n The index of the element for which data should be accessed. * @return Read-only (constant) reference to data. * @throw std::out_of_range If @a n is an invalid index. * * This function provides for safer data access. The parameter is first * checked that it is in the range of the deque. The function throws * out_of_range if the check fails. */ const_reference at(size_type __n) const { _M_range_check(__n); return (*this)[__n]; } /** * Returns a read/write reference to the data at the first element of the * %deque. */ reference front() { return *this->_M_impl._M_start; } /** * Returns a read-only (constant) reference to the data at the first * element of the %deque. */ const_reference front() const { return *this->_M_impl._M_start; } /** * Returns a read/write reference to the data at the last element of the * %deque. */ reference back() { iterator __tmp = this->_M_impl._M_finish; --__tmp; return *__tmp; } /** * Returns a read-only (constant) reference to the data at the last * element of the %deque. */ const_reference back() const { const_iterator __tmp = this->_M_impl._M_finish; --__tmp; return *__tmp; } // [23.2.1.2] modifiers /** * @brief Add data to the front of the %deque. * @param x Data to be added. * * This is a typical stack operation. The function creates an element at * the front of the %deque and assigns the given data to it. Due to the * nature of a %deque this operation can be done in constant time. */ void push_front(const value_type& __x) { if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_first) { std::_Construct(this->_M_impl._M_start._M_cur - 1, __x); --this->_M_impl._M_start._M_cur; } else _M_push_front_aux(__x); } /** * @brief Add data to the end of the %deque. * @param x Data to be added. * * This is a typical stack operation. The function creates an element at * the end of the %deque and assigns the given data to it. Due to the * nature of a %deque this operation can be done in constant time. */ void push_back(const value_type& __x) { if (this->_M_impl._M_finish._M_cur != this->_M_impl._M_finish._M_last - 1) { std::_Construct(this->_M_impl._M_finish._M_cur, __x); ++this->_M_impl._M_finish._M_cur; } else _M_push_back_aux(__x); } /** * @brief Removes first element. * * This is a typical stack operation. It shrinks the %deque by one. * * Note that no data is returned, and if the first element's data is * needed, it should be retrieved before pop_front() is called. */ void pop_front() { if (this->_M_impl._M_start._M_cur != this->_M_impl._M_start._M_last - 1) { std::_Destroy(this->_M_impl._M_start._M_cur); ++this->_M_impl._M_start._M_cur; } else _M_pop_front_aux(); } /** * @brief Removes last element. * * This is a typical stack operation. It shrinks the %deque by one. * * Note that no data is returned, and if the last element's data is * needed, it should be retrieved before pop_back() is called. */ void pop_back() { if (this->_M_impl._M_finish._M_cur != this->_M_impl._M_finish._M_first) { --this->_M_impl._M_finish._M_cur; std::_Destroy(this->_M_impl._M_finish._M_cur); } else _M_pop_back_aux(); } /** * @brief Inserts given value into %deque before specified iterator. * @param position An iterator into the %deque. * @param x Data to be inserted. * @return An iterator that points to the inserted data. * * This function will insert a copy of the given value before the * specified location. */ iterator insert(iterator position, const value_type& __x); /** * @brief Inserts a number of copies of given data into the %deque. * @param position An iterator into the %deque. * @param n Number of elements to be inserted. * @param x Data to be inserted. * * This function will insert a specified number of copies of the given * data before the location specified by @a position. */ void insert(iterator __position, size_type __n, const value_type& __x) { _M_fill_insert(__position, __n, __x); } /** * @brief Inserts a range into the %deque. * @param position An iterator into the %deque. * @param first An input iterator. * @param last An input iterator. * * This function will insert copies of the data in the range [first,last) * into the %deque before the location specified by @a pos. This is * known as "range insert." */ template<typename _InputIterator> void insert(iterator __position, _InputIterator __first, _InputIterator __last) { // Check whether it's an integral type. If so, it's not an iterator. typedef typename _Is_integer<_InputIterator>::_Integral _Integral; _M_insert_dispatch(__position, __first, __last, _Integral()); } /** * @brief Remove element at given position. * @param position Iterator pointing to element to be erased. * @return An iterator pointing to the next element (or end()). * * This function will erase the element at the given position and thus * shorten the %deque by one. * * The user is cautioned that * this function only erases the element, and that if the element is * itself a pointer, the pointed-to memory is not touched in any way. * Managing the pointer is the user's responsibilty. */ iterator erase(iterator __position); /** * @brief Remove a range of elements. * @param first Iterator pointing to the first element to be erased. * @param last Iterator pointing to one past the last element to be * erased. * @return An iterator pointing to the element pointed to by @a last * prior to erasing (or end()).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -