1// Vector implementation -*- C++ -*- 2 3// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 4// Free Software Foundation, Inc. 5// 6// This file is part of the GNU ISO C++ Library. This library is free 7// software; you can redistribute it and/or modify it under the 8// terms of the GNU General Public License as published by the 9// Free Software Foundation; either version 3, or (at your option) 10// any later version. 11 12// This library is distributed in the hope that it will be useful, 13// but WITHOUT ANY WARRANTY; without even the implied warranty of 14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15// GNU General Public License for more details. 16 17// Under Section 7 of GPL version 3, you are granted additional 18// permissions described in the GCC Runtime Library Exception, version 19// 3.1, as published by the Free Software Foundation. 20 21// You should have received a copy of the GNU General Public License and 22// a copy of the GCC Runtime Library Exception along with this program; 23// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24// <http://www.gnu.org/licenses/>. 25 26/* 27 * 28 * Copyright (c) 1994 29 * Hewlett-Packard Company 30 * 31 * Permission to use, copy, modify, distribute and sell this software 32 * and its documentation for any purpose is hereby granted without fee, 33 * provided that the above copyright notice appear in all copies and 34 * that both that copyright notice and this permission notice appear 35 * in supporting documentation. Hewlett-Packard Company makes no 36 * representations about the suitability of this software for any 37 * purpose. It is provided "as is" without express or implied warranty. 38 * 39 * 40 * Copyright (c) 1996 41 * Silicon Graphics Computer Systems, Inc. 42 * 43 * Permission to use, copy, modify, distribute and sell this software 44 * and its documentation for any purpose is hereby granted without fee, 45 * provided that the above copyright notice appear in all copies and 46 * that both that copyright notice and this permission notice appear 47 * in supporting documentation. Silicon Graphics makes no 48 * representations about the suitability of this software for any 49 * purpose. It is provided "as is" without express or implied warranty. 50 */ 51 52/** @file stl_vector.h 53 * This is an internal header file, included by other library headers. 54 * You should not attempt to use it directly. 55 */ 56 57#ifndef _STL_VECTOR_H 58#define _STL_VECTOR_H 1 59 60#include <bits/stl_iterator_base_funcs.h> 61#include <bits/functexcept.h> 62#include <bits/concept_check.h> 63#include <initializer_list> 64 65_GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GLIBCXX_STD_D) 66 67 /// See bits/stl_deque.h's _Deque_base for an explanation. 68 template<typename _Tp, typename _Alloc> 69 struct _Vector_base 70 { 71 typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type; 72 73 struct _Vector_impl 74 : public _Tp_alloc_type 75 { 76 typename _Tp_alloc_type::pointer _M_start; 77 typename _Tp_alloc_type::pointer _M_finish; 78 typename _Tp_alloc_type::pointer _M_end_of_storage; 79 80 _Vector_impl() 81 : _Tp_alloc_type(), _M_start(0), _M_finish(0), _M_end_of_storage(0) 82 { } 83 84 _Vector_impl(_Tp_alloc_type const& __a) 85 : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0) 86 { } 87 }; 88 89 public: 90 typedef _Alloc allocator_type; 91 92 _Tp_alloc_type& 93 _M_get_Tp_allocator() 94 { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); } 95 96 const _Tp_alloc_type& 97 _M_get_Tp_allocator() const 98 { return *static_cast<const _Tp_alloc_type*>(&this->_M_impl); } 99 100 allocator_type 101 get_allocator() const 102 { return allocator_type(_M_get_Tp_allocator()); } 103 104 _Vector_base() 105 : _M_impl() { } 106 107 _Vector_base(const allocator_type& __a) 108 : _M_impl(__a) { } 109 110 _Vector_base(size_t __n, const allocator_type& __a) 111 : _M_impl(__a) 112 { 113 this->_M_impl._M_start = this->_M_allocate(__n); 114 this->_M_impl._M_finish = this->_M_impl._M_start; 115 this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; 116 } 117 118#ifdef __GXX_EXPERIMENTAL_CXX0X__ 119 _Vector_base(_Vector_base&& __x) 120 : _M_impl(__x._M_get_Tp_allocator()) 121 { 122 this->_M_impl._M_start = __x._M_impl._M_start; 123 this->_M_impl._M_finish = __x._M_impl._M_finish; 124 this->_M_impl._M_end_of_storage = __x._M_impl._M_end_of_storage; 125 __x._M_impl._M_start = 0; 126 __x._M_impl._M_finish = 0; 127 __x._M_impl._M_end_of_storage = 0; 128 } 129#endif 130 131 ~_Vector_base() 132 { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage 133 - this->_M_impl._M_start); } 134 135 public: 136 _Vector_impl _M_impl; 137 138 typename _Tp_alloc_type::pointer 139 _M_allocate(size_t __n) 140 { return __n != 0 ? _M_impl.allocate(__n) : 0; } 141 142 void 143 _M_deallocate(typename _Tp_alloc_type::pointer __p, size_t __n) 144 { 145 if (__p) 146 _M_impl.deallocate(__p, __n); 147 } 148 }; 149 150 151 /** 152 * @brief A standard container which offers fixed time access to 153 * individual elements in any order. 154 * 155 * @ingroup sequences 156 * 157 * Meets the requirements of a <a href="tables.html#65">container</a>, a 158 * <a href="tables.html#66">reversible container</a>, and a 159 * <a href="tables.html#67">sequence</a>, including the 160 * <a href="tables.html#68">optional sequence requirements</a> with the 161 * %exception of @c push_front and @c pop_front. 162 * 163 * In some terminology a %vector can be described as a dynamic 164 * C-style array, it offers fast and efficient access to individual 165 * elements in any order and saves the user from worrying about 166 * memory and size allocation. Subscripting ( @c [] ) access is 167 * also provided as with C-style arrays. 168 */ 169 template<typename _Tp, typename _Alloc = std::allocator<_Tp> > 170 class vector : protected _Vector_base<_Tp, _Alloc> 171 { 172 // Concept requirements. 173 typedef typename _Alloc::value_type _Alloc_value_type; 174 __glibcxx_class_requires(_Tp, _SGIAssignableConcept) 175 __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept) 176 177 typedef _Vector_base<_Tp, _Alloc> _Base; 178 typedef typename _Base::_Tp_alloc_type _Tp_alloc_type; 179 180 public: 181 typedef _Tp value_type; 182 typedef typename _Tp_alloc_type::pointer pointer; 183 typedef typename _Tp_alloc_type::const_pointer const_pointer; 184 typedef typename _Tp_alloc_type::reference reference; 185 typedef typename _Tp_alloc_type::const_reference const_reference; 186 typedef __gnu_cxx::__normal_iterator<pointer, vector> iterator; 187 typedef __gnu_cxx::__normal_iterator<const_pointer, vector> 188 const_iterator; 189 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 190 typedef std::reverse_iterator<iterator> reverse_iterator; 191 typedef size_t size_type; 192 typedef ptrdiff_t difference_type; 193 typedef _Alloc allocator_type; 194 195 protected: 196 using _Base::_M_allocate; 197 using _Base::_M_deallocate; 198 using _Base::_M_impl; 199 using _Base::_M_get_Tp_allocator; 200 201 public: 202 // [23.2.4.1] construct/copy/destroy 203 // (assign() and get_allocator() are also listed in this section) 204 /** 205 * @brief Default constructor creates no elements. 206 */ 207 vector() 208 : _Base() { } 209 210 /** 211 * @brief Creates a %vector with no elements. 212 * @param a An allocator object. 213 */ 214 explicit 215 vector(const allocator_type& __a) 216 : _Base(__a) { } 217 218 /** 219 * @brief Creates a %vector with copies of an exemplar element. 220 * @param n The number of elements to initially create. 221 * @param value An element to copy. 222 * @param a An allocator. 223 * 224 * This constructor fills the %vector with @a n copies of @a value. 225 */ 226 explicit 227 vector(size_type __n, const value_type& __value = value_type(), 228 const allocator_type& __a = allocator_type()) 229 : _Base(__n, __a) 230 { _M_fill_initialize(__n, __value); } 231 232 /** 233 * @brief %Vector copy constructor. 234 * @param x A %vector of identical element and allocator types. 235 * 236 * The newly-created %vector uses a copy of the allocation 237 * object used by @a x. All the elements of @a x are copied, 238 * but any extra memory in 239 * @a x (for fast expansion) will not be copied. 240 */ 241 vector(const vector& __x) 242 : _Base(__x.size(), __x._M_get_Tp_allocator()) 243 { this->_M_impl._M_finish = 244 std::__uninitialized_copy_a(__x.begin(), __x.end(), 245 this->_M_impl._M_start, 246 _M_get_Tp_allocator()); 247 } 248 249#ifdef __GXX_EXPERIMENTAL_CXX0X__ 250 /** 251 * @brief %Vector move constructor. 252 * @param x A %vector of identical element and allocator types. 253 * 254 * The newly-created %vector contains the exact contents of @a x. 255 * The contents of @a x are a valid, but unspecified %vector. 256 */ 257 vector(vector&& __x) 258 : _Base(std::forward<_Base>(__x)) { } 259 260 /** 261 * @brief Builds a %vector from an initializer list. 262 * @param l An initializer_list. 263 * @param a An allocator. 264 * 265 * Create a %vector consisting of copies of the elements in the 266 * initializer_list @a l. 267 * 268 * This will call the element type's copy constructor N times 269 * (where N is @a l.size()) and do no memory reallocation. 270 */ 271 vector(initializer_list<value_type> __l, 272 const allocator_type& __a = allocator_type()) 273 : _Base(__a) 274 { 275 _M_range_initialize(__l.begin(), __l.end(), 276 random_access_iterator_tag()); 277 } 278#endif 279 280 /** 281 * @brief Builds a %vector from a range. 282 * @param first An input iterator. 283 * @param last An input iterator. 284 * @param a An allocator. 285 * 286 * Create a %vector consisting of copies of the elements from 287 * [first,last). 288 * 289 * If the iterators are forward, bidirectional, or 290 * random-access, then this will call the elements' copy 291 * constructor N times (where N is distance(first,last)) and do 292 * no memory reallocation. But if only input iterators are 293 * used, then this will do at most 2N calls to the copy 294 * constructor, and logN memory reallocations. 295 */ 296 template<typename _InputIterator> 297 vector(_InputIterator __first, _InputIterator __last, 298 const allocator_type& __a = allocator_type()) 299 : _Base(__a) 300 { 301 // Check whether it's an integral type. If so, it's not an iterator. 302 typedef typename std::__is_integer<_InputIterator>::__type _Integral; 303 _M_initialize_dispatch(__first, __last, _Integral()); 304 } 305 306 /** 307 * The dtor only erases the elements, and note that if the 308 * elements themselves are pointers, the pointed-to memory is 309 * not touched in any way. Managing the pointer is the user's 310 * responsibility. 311 */ 312 ~vector() 313 { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish, 314 _M_get_Tp_allocator()); } 315 316 /** 317 * @brief %Vector assignment operator. 318 * @param x A %vector of identical element and allocator types. 319 * 320 * All the elements of @a x are copied, but any extra memory in 321 * @a x (for fast expansion) will not be copied. Unlike the 322 * copy constructor, the allocator object is not copied. 323 */ 324 vector& 325 operator=(const vector& __x); 326 327#ifdef __GXX_EXPERIMENTAL_CXX0X__ 328 /** 329 * @brief %Vector move assignment operator. 330 * @param x A %vector of identical element and allocator types. 331 * 332 * The contents of @a x are moved into this %vector (without copying). 333 * @a x is a valid, but unspecified %vector. 334 */ 335 vector& 336 operator=(vector&& __x) 337 { 338 // NB: DR 675. 339 this->clear(); 340 this->swap(__x); 341 return *this; 342 } 343 344 /** 345 * @brief %Vector list assignment operator. 346 * @param l An initializer_list. 347 * 348 * This function fills a %vector with copies of the elements in the 349 * initializer list @a l. 350 * 351 * Note that the assignment completely changes the %vector and 352 * that the resulting %vector's size is the same as the number 353 * of elements assigned. Old data may be lost. 354 */ 355 vector& 356 operator=(initializer_list<value_type> __l) 357 { 358 this->assign(__l.begin(), __l.end()); 359 return *this; 360 } 361#endif 362 363 /** 364 * @brief Assigns a given value to a %vector. 365 * @param n Number of elements to be assigned. 366 * @param val Value to be assigned. 367 * 368 * This function fills a %vector with @a n copies of the given 369 * value. Note that the assignment completely changes the 370 * %vector and that the resulting %vector's size is the same as 371 * the number of elements assigned. Old data may be lost. 372 */ 373 void 374 assign(size_type __n, const value_type& __val) 375 { _M_fill_assign(__n, __val); } 376 377 /** 378 * @brief Assigns a range to a %vector. 379 * @param first An input iterator. 380 * @param last An input iterator. 381 * 382 * This function fills a %vector with copies of the elements in the 383 * range [first,last). 384 * 385 * Note that the assignment completely changes the %vector and 386 * that the resulting %vector's size is the same as the number 387 * of elements assigned. Old data may be lost. 388 */ 389 template<typename _InputIterator> 390 void 391 assign(_InputIterator __first, _InputIterator __last) 392 { 393 // Check whether it's an integral type. If so, it's not an iterator. 394 typedef typename std::__is_integer<_InputIterator>::__type _Integral; 395 _M_assign_dispatch(__first, __last, _Integral()); 396 } 397 398#ifdef __GXX_EXPERIMENTAL_CXX0X__ 399 /** 400 * @brief Assigns an initializer list to a %vector. 401 * @param l An initializer_list. 402 * 403 * This function fills a %vector with copies of the elements in the 404 * initializer list @a l. 405 * 406 * Note that the assignment completely changes the %vector and 407 * that the resulting %vector's size is the same as the number 408 * of elements assigned. Old data may be lost. 409 */ 410 void 411 assign(initializer_list<value_type> __l) 412 { this->assign(__l.begin(), __l.end()); } 413#endif 414 415 /// Get a copy of the memory allocation object. 416 using _Base::get_allocator; 417 418 // iterators 419 /** 420 * Returns a read/write iterator that points to the first 421 * element in the %vector. Iteration is done in ordinary 422 * element order. 423 */ 424 iterator 425 begin() 426 { return iterator(this->_M_impl._M_start); } 427 428 /** 429 * Returns a read-only (constant) iterator that points to the 430 * first element in the %vector. Iteration is done in ordinary 431 * element order. 432 */ 433 const_iterator 434 begin() const 435 { return const_iterator(this->_M_impl._M_start); } 436 437 /** 438 * Returns a read/write iterator that points one past the last 439 * element in the %vector. Iteration is done in ordinary 440 * element order. 441 */ 442 iterator 443 end() 444 { return iterator(this->_M_impl._M_finish); } 445 446 /** 447 * Returns a read-only (constant) iterator that points one past 448 * the last element in the %vector. Iteration is done in 449 * ordinary element order. 450 */ 451 const_iterator 452 end() const 453 { return const_iterator(this->_M_impl._M_finish); } 454 455 /** 456 * Returns a read/write reverse iterator that points to the 457 * last element in the %vector. Iteration is done in reverse 458 * element order. 459 */ 460 reverse_iterator 461 rbegin() 462 { return reverse_iterator(end()); } 463 464 /** 465 * Returns a read-only (constant) reverse iterator that points 466 * to the last element in the %vector. Iteration is done in 467 * reverse element order. 468 */ 469 const_reverse_iterator 470 rbegin() const 471 { return const_reverse_iterator(end()); } 472 473 /** 474 * Returns a read/write reverse iterator that points to one 475 * before the first element in the %vector. Iteration is done 476 * in reverse element order. 477 */ 478 reverse_iterator 479 rend() 480 { return reverse_iterator(begin()); } 481 482 /** 483 * Returns a read-only (constant) reverse iterator that points 484 * to one before the first element in the %vector. Iteration 485 * is done in reverse element order. 486 */ 487 const_reverse_iterator 488 rend() const 489 { return const_reverse_iterator(begin()); } 490 491#ifdef __GXX_EXPERIMENTAL_CXX0X__ 492 /** 493 * Returns a read-only (constant) iterator that points to the 494 * first element in the %vector. Iteration is done in ordinary 495 * element order. 496 */ 497 const_iterator 498 cbegin() const 499 { return const_iterator(this->_M_impl._M_start); } 500 501 /** 502 * Returns a read-only (constant) iterator that points one past 503 * the last element in the %vector. Iteration is done in 504 * ordinary element order. 505 */ 506 const_iterator 507 cend() const 508 { return const_iterator(this->_M_impl._M_finish); } 509 510 /** 511 * Returns a read-only (constant) reverse iterator that points 512 * to the last element in the %vector. Iteration is done in 513 * reverse element order. 514 */ 515 const_reverse_iterator 516 crbegin() const 517 { return const_reverse_iterator(end()); } 518 519 /** 520 * Returns a read-only (constant) reverse iterator that points 521 * to one before the first element in the %vector. Iteration 522 * is done in reverse element order. 523 */ 524 const_reverse_iterator 525 crend() const 526 { return const_reverse_iterator(begin()); } 527#endif 528 529 // [23.2.4.2] capacity 530 /** Returns the number of elements in the %vector. */ 531 size_type 532 size() const 533 { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); } 534 535 /** Returns the size() of the largest possible %vector. */ 536 size_type 537 max_size() const 538 { return _M_get_Tp_allocator().max_size(); } 539 540 /** 541 * @brief Resizes the %vector to the specified number of elements. 542 * @param new_size Number of elements the %vector should contain. 543 * @param x Data with which new elements should be populated. 544 * 545 * This function will %resize the %vector to the specified 546 * number of elements. If the number is smaller than the 547 * %vector's current size the %vector is truncated, otherwise 548 * the %vector is extended and new elements are populated with 549 * given data. 550 */ 551 void 552 resize(size_type __new_size, value_type __x = value_type()) 553 { 554 if (__new_size < size()) 555 _M_erase_at_end(this->_M_impl._M_start + __new_size); 556 else 557 insert(end(), __new_size - size(), __x); 558 } 559 560 /** 561 * Returns the total number of elements that the %vector can 562 * hold before needing to allocate more memory. 563 */ 564 size_type 565 capacity() const 566 { return size_type(this->_M_impl._M_end_of_storage 567 - this->_M_impl._M_start); } 568 569 /** 570 * Returns true if the %vector is empty. (Thus begin() would 571 * equal end().) 572 */ 573 bool 574 empty() const 575 { return begin() == end(); } 576 577 /** 578 * @brief Attempt to preallocate enough memory for specified number of 579 * elements. 580 * @param n Number of elements required. 581 * @throw std::length_error If @a n exceeds @c max_size(). 582 * 583 * This function attempts to reserve enough memory for the 584 * %vector to hold the specified number of elements. If the 585 * number requested is more than max_size(), length_error is 586 * thrown. 587 * 588 * The advantage of this function is that if optimal code is a 589 * necessity and the user can determine the number of elements 590 * that will be required, the user can reserve the memory in 591 * %advance, and thus prevent a possible reallocation of memory 592 * and copying of %vector data. 593 */ 594 void 595 reserve(size_type __n); 596 597 // element access 598 /** 599 * @brief Subscript access to the data contained in the %vector. 600 * @param n The index of the element for which data should be 601 * accessed. 602 * @return Read/write reference to data. 603 * 604 * This operator allows for easy, array-style, data access. 605 * Note that data access with this operator is unchecked and 606 * out_of_range lookups are not defined. (For checked lookups 607 * see at().) 608 * 609 * Local modification: range checks are performed if 610 * __google_stl_debug_vector is defined to non-zero. 611 */ 612 reference 613 operator[](size_type __n) 614 { 615#if __google_stl_debug_vector 616 _M_range_check(__n); 617#endif 618 return *(this->_M_impl._M_start + __n); 619 } 620 621 /** 622 * @brief Subscript access to the data contained in the %vector. 623 * @param n The index of the element for which data should be 624 * accessed. 625 * @return Read-only (constant) reference to data. 626 * 627 * This operator allows for easy, array-style, data access. 628 * Note that data access with this operator is unchecked and 629 * out_of_range lookups are not defined. (For checked lookups 630 * see at().) 631 * 632 * Local modification: range checks are performed if 633 * __google_stl_debug_vector is defined to non-zero. 634 */ 635 const_reference 636 operator[](size_type __n) const 637 { 638#if __google_stl_debug_vector 639 _M_range_check(__n); 640#endif 641 return *(this->_M_impl._M_start + __n); 642 } 643 644 protected: 645 /// Safety check used only from at(). 646 void 647 _M_range_check(size_type __n) const 648 { 649 if (__n >= this->size()) 650 __throw_out_of_range(__N("vector::_M_range_check")); 651 } 652 653 public: 654 /** 655 * @brief Provides access to the data contained in the %vector. 656 * @param n The index of the element for which data should be 657 * accessed. 658 * @return Read/write reference to data. 659 * @throw std::out_of_range If @a n is an invalid index. 660 * 661 * This function provides for safer data access. The parameter 662 * is first checked that it is in the range of the vector. The 663 * function throws out_of_range if the check fails. 664 */ 665 reference 666 at(size_type __n) 667 { 668 _M_range_check(__n); 669 return (*this)[__n]; 670 } 671 672 /** 673 * @brief Provides access to the data contained in the %vector. 674 * @param n The index of the element for which data should be 675 * accessed. 676 * @return Read-only (constant) reference to data. 677 * @throw std::out_of_range If @a n is an invalid index. 678 * 679 * This function provides for safer data access. The parameter 680 * is first checked that it is in the range of the vector. The 681 * function throws out_of_range if the check fails. 682 */ 683 const_reference 684 at(size_type __n) const 685 { 686 _M_range_check(__n); 687 return (*this)[__n]; 688 } 689 690 /** 691 * Returns a read/write reference to the data at the first 692 * element of the %vector. 693 */ 694 reference 695 front() 696 { return *begin(); } 697 698 /** 699 * Returns a read-only (constant) reference to the data at the first 700 * element of the %vector. 701 */ 702 const_reference 703 front() const 704 { return *begin(); } 705 706 /** 707 * Returns a read/write reference to the data at the last 708 * element of the %vector. 709 */ 710 reference 711 back() 712 { return *(end() - 1); } 713 714 /** 715 * Returns a read-only (constant) reference to the data at the 716 * last element of the %vector. 717 */ 718 const_reference 719 back() const 720 { return *(end() - 1); } 721 722 // _GLIBCXX_RESOLVE_LIB_DEFECTS 723 // DR 464. Suggestion for new member functions in standard containers. 724 // data access 725 /** 726 * Returns a pointer such that [data(), data() + size()) is a valid 727 * range. For a non-empty %vector, data() == &front(). 728 */ 729 pointer 730 data() 731 { return pointer(this->_M_impl._M_start); } 732 733 const_pointer 734 data() const 735 { return const_pointer(this->_M_impl._M_start); } 736 737 // [23.2.4.3] modifiers 738 /** 739 * @brief Add data to the end of the %vector. 740 * @param x Data to be added. 741 * 742 * This is a typical stack operation. The function creates an 743 * element at the end of the %vector and assigns the given data 744 * to it. Due to the nature of a %vector this operation can be 745 * done in constant time if the %vector has preallocated space 746 * available. 747 */ 748 void 749 push_back(const value_type& __x) 750 { 751 if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage) 752 { 753 this->_M_impl.construct(this->_M_impl._M_finish, __x); 754 ++this->_M_impl._M_finish; 755 } 756 else 757 _M_insert_aux(end(), __x); 758 } 759 760#ifdef __GXX_EXPERIMENTAL_CXX0X__ 761 void 762 push_back(value_type&& __x) 763 { emplace_back(std::move(__x)); } 764 765 template<typename... _Args> 766 void 767 emplace_back(_Args&&... __args); 768#endif 769 770 /** 771 * @brief Removes last element. 772 * 773 * This is a typical stack operation. It shrinks the %vector by one. 774 * 775 * Note that no data is returned, and if the last element's 776 * data is needed, it should be retrieved before pop_back() is 777 * called. 778 */ 779 void 780 pop_back() 781 { 782 --this->_M_impl._M_finish; 783 this->_M_impl.destroy(this->_M_impl._M_finish); 784 } 785 786#ifdef __GXX_EXPERIMENTAL_CXX0X__ 787 /** 788 * @brief Inserts an object in %vector before specified iterator. 789 * @param position An iterator into the %vector. 790 * @param args Arguments. 791 * @return An iterator that points to the inserted data. 792 * 793 * This function will insert an object of type T constructed 794 * with T(std::forward<Args>(args)...) before the specified location. 795 * Note that this kind of operation could be expensive for a %vector 796 * and if it is frequently used the user should consider using 797 * std::list. 798 */ 799 template<typename... _Args> 800 iterator 801 emplace(iterator __position, _Args&&... __args); 802#endif 803 804 /** 805 * @brief Inserts given value into %vector before specified iterator. 806 * @param position An iterator into the %vector. 807 * @param x Data to be inserted. 808 * @return An iterator that points to the inserted data. 809 * 810 * This function will insert a copy of the given value before 811 * the specified location. Note that this kind of operation 812 * could be expensive for a %vector and if it is frequently 813 * used the user should consider using std::list. 814 */ 815 iterator 816 insert(iterator __position, const value_type& __x); 817 818#ifdef __GXX_EXPERIMENTAL_CXX0X__ 819 /** 820 * @brief Inserts given rvalue into %vector before specified iterator. 821 * @param position An iterator into the %vector. 822 * @param x Data to be inserted. 823 * @return An iterator that points to the inserted data. 824 * 825 * This function will insert a copy of the given rvalue before 826 * the specified location. Note that this kind of operation 827 * could be expensive for a %vector and if it is frequently 828 * used the user should consider using std::list. 829 */ 830 iterator 831 insert(iterator __position, value_type&& __x) 832 { return emplace(__position, std::move(__x)); } 833 834 /** 835 * @brief Inserts an initializer_list into the %vector. 836 * @param position An iterator into the %vector. 837 * @param l An initializer_list. 838 * 839 * This function will insert copies of the data in the 840 * initializer_list @a l into the %vector before the location 841 * specified by @a position. 842 * 843 * Note that this kind of operation could be expensive for a 844 * %vector and if it is frequently used the user should 845 * consider using std::list. 846 */ 847 void 848 insert(iterator __position, initializer_list<value_type> __l) 849 { this->insert(__position, __l.begin(), __l.end()); } 850#endif 851 852 /** 853 * @brief Inserts a number of copies of given data into the %vector. 854 * @param position An iterator into the %vector. 855 * @param n Number of elements to be inserted. 856 * @param x Data to be inserted. 857 * 858 * This function will insert a specified number of copies of 859 * the given data before the location specified by @a position. 860 * 861 * Note that this kind of operation could be expensive for a 862 * %vector and if it is frequently used the user should 863 * consider using std::list. 864 */ 865 void 866 insert(iterator __position, size_type __n, const value_type& __x) 867 { _M_fill_insert(__position, __n, __x); } 868 869 /** 870 * @brief Inserts a range into the %vector. 871 * @param position An iterator into the %vector. 872 * @param first An input iterator. 873 * @param last An input iterator. 874 * 875 * This function will insert copies of the data in the range 876 * [first,last) into the %vector before the location specified 877 * by @a pos. 878 * 879 * Note that this kind of operation could be expensive for a 880 * %vector and if it is frequently used the user should 881 * consider using std::list. 882 */ 883 template<typename _InputIterator> 884 void 885 insert(iterator __position, _InputIterator __first, 886 _InputIterator __last) 887 { 888 // Check whether it's an integral type. If so, it's not an iterator. 889 typedef typename std::__is_integer<_InputIterator>::__type _Integral; 890 _M_insert_dispatch(__position, __first, __last, _Integral()); 891 } 892 893 /** 894 * @brief Remove element at given position. 895 * @param position Iterator pointing to element to be erased. 896 * @return An iterator pointing to the next element (or end()). 897 * 898 * This function will erase the element at the given position and thus 899 * shorten the %vector by one. 900 * 901 * Note This operation could be expensive and if it is 902 * frequently used the user should consider using std::list. 903 * The user is also cautioned that this function only erases 904 * the element, and that if the element is itself a pointer, 905 * the pointed-to memory is not touched in any way. Managing 906 * the pointer is the user's responsibility. 907 */ 908 iterator 909 erase(iterator __position); 910 911 /** 912 * @brief Remove a range of elements. 913 * @param first Iterator pointing to the first element to be erased. 914 * @param last Iterator pointing to one past the last element to be 915 * erased. 916 * @return An iterator pointing to the element pointed to by @a last 917 * prior to erasing (or end()). 918 * 919 * This function will erase the elements in the range [first,last) and 920 * shorten the %vector accordingly. 921 * 922 * Note This operation could be expensive and if it is 923 * frequently used the user should consider using std::list. 924 * The user is also cautioned that this function only erases 925 * the elements, and that if the elements themselves are 926 * pointers, the pointed-to memory is not touched in any way. 927 * Managing the pointer is the user's responsibility. 928 */ 929 iterator 930 erase(iterator __first, iterator __last); 931 932 /** 933 * @brief Swaps data with another %vector. 934 * @param x A %vector of the same element and allocator types. 935 * 936 * This exchanges the elements between two vectors in constant time. 937 * (Three pointers, so it should be quite fast.) 938 * Note that the global std::swap() function is specialized such that 939 * std::swap(v1,v2) will feed to this function. 940 */ 941 void 942#ifdef __GXX_EXPERIMENTAL_CXX0X__ 943 swap(vector&& __x) 944#else 945 swap(vector& __x) 946#endif 947 { 948 std::swap(this->_M_impl._M_start, __x._M_impl._M_start); 949 std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish); 950 std::swap(this->_M_impl._M_end_of_storage, 951 __x._M_impl._M_end_of_storage); 952 953 // _GLIBCXX_RESOLVE_LIB_DEFECTS 954 // 431. Swapping containers with unequal allocators. 955 std::__alloc_swap<_Tp_alloc_type>::_S_do_it(_M_get_Tp_allocator(), 956 __x._M_get_Tp_allocator()); 957 } 958 959 /** 960 * Erases all the elements. Note that this function only erases the 961 * elements, and that if the elements themselves are pointers, the 962 * pointed-to memory is not touched in any way. Managing the pointer is 963 * the user's responsibility. 964 */ 965 void 966 clear() 967 { _M_erase_at_end(this->_M_impl._M_start); } 968 969 protected: 970 /** 971 * Memory expansion handler. Uses the member allocation function to 972 * obtain @a n bytes of memory, and then copies [first,last) into it. 973 */ 974 template<typename _ForwardIterator> 975 pointer 976 _M_allocate_and_copy(size_type __n, 977 _ForwardIterator __first, _ForwardIterator __last) 978 { 979 pointer __result = this->_M_allocate(__n); 980 __try 981 { 982 std::__uninitialized_copy_a(__first, __last, __result, 983 _M_get_Tp_allocator()); 984 return __result; 985 } 986 __catch(...) 987 { 988 _M_deallocate(__result, __n); 989 __throw_exception_again; 990 } 991 } 992 993 994 // Internal constructor functions follow. 995 996 // Called by the range constructor to implement [23.1.1]/9 997 998 // _GLIBCXX_RESOLVE_LIB_DEFECTS 999 // 438. Ambiguity in the "do the right thing" clause 1000 template<typename _Integer> 1001 void 1002 _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type) 1003 { 1004 this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n)); 1005 this->_M_impl._M_end_of_storage = 1006 this->_M_impl._M_start + static_cast<size_type>(__n); 1007 _M_fill_initialize(static_cast<size_type>(__n), __value); 1008 } 1009 1010 // Called by the range constructor to implement [23.1.1]/9 1011 template<typename _InputIterator> 1012 void 1013 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last, 1014 __false_type) 1015 { 1016 typedef typename std::iterator_traits<_InputIterator>:: 1017 iterator_category _IterCategory; 1018 _M_range_initialize(__first, __last, _IterCategory()); 1019 } 1020 1021 // Called by the second initialize_dispatch above 1022 template<typename _InputIterator> 1023 void 1024 _M_range_initialize(_InputIterator __first, 1025 _InputIterator __last, std::input_iterator_tag) 1026 { 1027 for (; __first != __last; ++__first) 1028 push_back(*__first); 1029 } 1030 1031 // Called by the second initialize_dispatch above 1032 template<typename _ForwardIterator> 1033 void 1034 _M_range_initialize(_ForwardIterator __first, 1035 _ForwardIterator __last, std::forward_iterator_tag) 1036 { 1037 const size_type __n = std::distance(__first, __last); 1038 this->_M_impl._M_start = this->_M_allocate(__n); 1039 this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n; 1040 this->_M_impl._M_finish = 1041 std::__uninitialized_copy_a(__first, __last, 1042 this->_M_impl._M_start, 1043 _M_get_Tp_allocator()); 1044 } 1045 1046 // Called by the first initialize_dispatch above and by the 1047 // vector(n,value,a) constructor. 1048 void 1049 _M_fill_initialize(size_type __n, const value_type& __value) 1050 { 1051 std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value, 1052 _M_get_Tp_allocator()); 1053 this->_M_impl._M_finish = this->_M_impl._M_end_of_storage; 1054 } 1055 1056 1057 // Internal assign functions follow. The *_aux functions do the actual 1058 // assignment work for the range versions. 1059 1060 // Called by the range assign to implement [23.1.1]/9 1061 1062 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1063 // 438. Ambiguity in the "do the right thing" clause 1064 template<typename _Integer> 1065 void 1066 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type) 1067 { _M_fill_assign(__n, __val); } 1068 1069 // Called by the range assign to implement [23.1.1]/9 1070 template<typename _InputIterator> 1071 void 1072 _M_assign_dispatch(_InputIterator __first, _InputIterator __last, 1073 __false_type) 1074 { 1075 typedef typename std::iterator_traits<_InputIterator>:: 1076 iterator_category _IterCategory; 1077 _M_assign_aux(__first, __last, _IterCategory()); 1078 } 1079 1080 // Called by the second assign_dispatch above 1081 template<typename _InputIterator> 1082 void 1083 _M_assign_aux(_InputIterator __first, _InputIterator __last, 1084 std::input_iterator_tag); 1085 1086 // Called by the second assign_dispatch above 1087 template<typename _ForwardIterator> 1088 void 1089 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last, 1090 std::forward_iterator_tag); 1091 1092 // Called by assign(n,t), and the range assign when it turns out 1093 // to be the same thing. 1094 void 1095 _M_fill_assign(size_type __n, const value_type& __val); 1096 1097 1098 // Internal insert functions follow. 1099 1100 // Called by the range insert to implement [23.1.1]/9 1101 1102 // _GLIBCXX_RESOLVE_LIB_DEFECTS 1103 // 438. Ambiguity in the "do the right thing" clause 1104 template<typename _Integer> 1105 void 1106 _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val, 1107 __true_type) 1108 { _M_fill_insert(__pos, __n, __val); } 1109 1110 // Called by the range insert to implement [23.1.1]/9 1111 template<typename _InputIterator> 1112 void 1113 _M_insert_dispatch(iterator __pos, _InputIterator __first, 1114 _InputIterator __last, __false_type) 1115 { 1116 typedef typename std::iterator_traits<_InputIterator>:: 1117 iterator_category _IterCategory; 1118 _M_range_insert(__pos, __first, __last, _IterCategory()); 1119 } 1120 1121 // Called by the second insert_dispatch above 1122 template<typename _InputIterator> 1123 void 1124 _M_range_insert(iterator __pos, _InputIterator __first, 1125 _InputIterator __last, std::input_iterator_tag); 1126 1127 // Called by the second insert_dispatch above 1128 template<typename _ForwardIterator> 1129 void 1130 _M_range_insert(iterator __pos, _ForwardIterator __first, 1131 _ForwardIterator __last, std::forward_iterator_tag); 1132 1133 // Called by insert(p,n,x), and the range insert when it turns out to be 1134 // the same thing. 1135 void 1136 _M_fill_insert(iterator __pos, size_type __n, const value_type& __x); 1137 1138 // Called by insert(p,x) 1139#ifndef __GXX_EXPERIMENTAL_CXX0X__ 1140 void 1141 _M_insert_aux(iterator __position, const value_type& __x); 1142#else 1143 template<typename... _Args> 1144 void 1145 _M_insert_aux(iterator __position, _Args&&... __args); 1146#endif 1147 1148 // Called by the latter. 1149 size_type 1150 _M_check_len(size_type __n, const char* __s) const 1151 { 1152 if (max_size() - size() < __n) 1153 __throw_length_error(__N(__s)); 1154 1155 const size_type __len = size() + std::max(size(), __n); 1156 return (__len < size() || __len > max_size()) ? max_size() : __len; 1157 } 1158 1159 // Internal erase functions follow. 1160 1161 // Called by erase(q1,q2), clear(), resize(), _M_fill_assign, 1162 // _M_assign_aux. 1163 void 1164 _M_erase_at_end(pointer __pos) 1165 { 1166 std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator()); 1167 this->_M_impl._M_finish = __pos; 1168 } 1169 }; 1170 1171 1172 /** 1173 * @brief Vector equality comparison. 1174 * @param x A %vector. 1175 * @param y A %vector of the same type as @a x. 1176 * @return True iff the size and elements of the vectors are equal. 1177 * 1178 * This is an equivalence relation. It is linear in the size of the 1179 * vectors. Vectors are considered equivalent if their sizes are equal, 1180 * and if corresponding elements compare equal. 1181 */ 1182 template<typename _Tp, typename _Alloc> 1183 inline bool 1184 operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) 1185 { return (__x.size() == __y.size() 1186 && std::equal(__x.begin(), __x.end(), __y.begin())); } 1187 1188 /** 1189 * @brief Vector ordering relation. 1190 * @param x A %vector. 1191 * @param y A %vector of the same type as @a x. 1192 * @return True iff @a x is lexicographically less than @a y. 1193 * 1194 * This is a total ordering relation. It is linear in the size of the 1195 * vectors. The elements must be comparable with @c <. 1196 * 1197 * See std::lexicographical_compare() for how the determination is made. 1198 */ 1199 template<typename _Tp, typename _Alloc> 1200 inline bool 1201 operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) 1202 { return std::lexicographical_compare(__x.begin(), __x.end(), 1203 __y.begin(), __y.end()); } 1204 1205 /// Based on operator== 1206 template<typename _Tp, typename _Alloc> 1207 inline bool 1208 operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) 1209 { return !(__x == __y); } 1210 1211 /// Based on operator< 1212 template<typename _Tp, typename _Alloc> 1213 inline bool 1214 operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) 1215 { return __y < __x; } 1216 1217 /// Based on operator< 1218 template<typename _Tp, typename _Alloc> 1219 inline bool 1220 operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) 1221 { return !(__y < __x); } 1222 1223 /// Based on operator< 1224 template<typename _Tp, typename _Alloc> 1225 inline bool 1226 operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y) 1227 { return !(__x < __y); } 1228 1229 /// See std::vector::swap(). 1230 template<typename _Tp, typename _Alloc> 1231 inline void 1232 swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y) 1233 { __x.swap(__y); } 1234 1235#ifdef __GXX_EXPERIMENTAL_CXX0X__ 1236 template<typename _Tp, typename _Alloc> 1237 inline void 1238 swap(vector<_Tp, _Alloc>&& __x, vector<_Tp, _Alloc>& __y) 1239 { __x.swap(__y); } 1240 1241 template<typename _Tp, typename _Alloc> 1242 inline void 1243 swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>&& __y) 1244 { __x.swap(__y); } 1245#endif 1246 1247_GLIBCXX_END_NESTED_NAMESPACE 1248 1249#endif /* _STL_VECTOR_H */ 1250