Line data Source code
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 1310796 : {
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 1310916 : _Vector_impl()
81 1310916 : : _Tp_alloc_type(), _M_start(0), _M_finish(0), _M_end_of_storage(0)
82 1310924 : { }
83 :
84 99456 : _Vector_impl(_Tp_alloc_type const& __a)
85 99456 : : _Tp_alloc_type(__a), _M_start(0), _M_finish(0), _M_end_of_storage(0)
86 99456 : { }
87 : };
88 :
89 : public:
90 : typedef _Alloc allocator_type;
91 :
92 : _Tp_alloc_type&
93 5995353 : _M_get_Tp_allocator()
94 5995353 : { return *static_cast<_Tp_alloc_type*>(&this->_M_impl); }
95 :
96 : const _Tp_alloc_type&
97 3056863 : _M_get_Tp_allocator() const
98 3056863 : { 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 1310921 : _Vector_base()
105 1310921 : : _M_impl() { }
106 :
107 99456 : _Vector_base(const allocator_type& __a)
108 99456 : : _M_impl(__a) { }
109 :
110 0 : _Vector_base(size_t __n, const allocator_type& __a)
111 0 : : _M_impl(__a)
112 : {
113 0 : this->_M_impl._M_start = this->_M_allocate(__n);
114 0 : this->_M_impl._M_finish = this->_M_impl._M_start;
115 0 : this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
116 0 : }
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 1310794 : ~_Vector_base()
132 1310794 : { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
133 1310792 : - this->_M_impl._M_start); }
134 :
135 : public:
136 : _Vector_impl _M_impl;
137 :
138 : typename _Tp_alloc_type::pointer
139 1627897 : _M_allocate(size_t __n)
140 1627897 : { return __n != 0 ? _M_impl.allocate(__n) : 0; }
141 :
142 : void
143 2839135 : _M_deallocate(typename _Tp_alloc_type::pointer __p, size_t __n)
144 : {
145 2839135 : if (__p)
146 1528305 : _M_impl.deallocate(__p, __n);
147 2839133 : }
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 1310910 : vector()
208 1310910 : : _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 0 : vector(size_type __n, const value_type& __value = value_type(),
228 : const allocator_type& __a = allocator_type())
229 0 : : _Base(__n, __a)
230 0 : { _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 0 : vector(const vector& __x)
242 0 : : _Base(__x.size(), __x._M_get_Tp_allocator())
243 0 : { 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 0 : }
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 99456 : vector(_InputIterator __first, _InputIterator __last,
298 : const allocator_type& __a = allocator_type())
299 99456 : : _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 99456 : _M_initialize_dispatch(__first, __last, _Integral());
304 99456 : }
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 1310791 : ~vector()
313 1310791 : { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
314 1310791 : _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 2938549 : begin()
426 2938549 : { 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 11163278 : begin() const
435 11163278 : { 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 4489367 : end()
444 4489367 : { 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 21016091 : end() const
453 21016091 : { 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 0 : rbegin()
462 0 : { 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 0 : rbegin() const
471 0 : { 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 0 : rend()
480 0 : { 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 0 : rend() const
489 0 : { 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 6113712 : size() const
533 6113712 : { 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 3056857 : max_size() const
538 3056857 : { 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 0 : resize(size_type __new_size, value_type __x = value_type())
553 : {
554 0 : if (__new_size < size())
555 0 : _M_erase_at_end(this->_M_impl._M_start + __new_size);
556 : else
557 0 : insert(end(), __new_size - size(), __x);
558 0 : }
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 0 : capacity() const
566 : { return size_type(this->_M_impl._M_end_of_storage
567 0 : - 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 11163277 : empty() const
575 11163277 : { 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 : reference
610 0 : operator[](size_type __n)
611 0 : { return *(this->_M_impl._M_start + __n); }
612 :
613 : /**
614 : * @brief Subscript access to the data contained in the %vector.
615 : * @param n The index of the element for which data should be
616 : * accessed.
617 : * @return Read-only (constant) reference to data.
618 : *
619 : * This operator allows for easy, array-style, data access.
620 : * Note that data access with this operator is unchecked and
621 : * out_of_range lookups are not defined. (For checked lookups
622 : * see at().)
623 : */
624 : const_reference
625 0 : operator[](size_type __n) const
626 0 : { return *(this->_M_impl._M_start + __n); }
627 :
628 : protected:
629 : /// Safety check used only from at().
630 : void
631 : _M_range_check(size_type __n) const
632 : {
633 : if (__n >= this->size())
634 : __throw_out_of_range(__N("vector::_M_range_check"));
635 : }
636 :
637 : public:
638 : /**
639 : * @brief Provides access to the data contained in the %vector.
640 : * @param n The index of the element for which data should be
641 : * accessed.
642 : * @return Read/write reference to data.
643 : * @throw std::out_of_range If @a n is an invalid index.
644 : *
645 : * This function provides for safer data access. The parameter
646 : * is first checked that it is in the range of the vector. The
647 : * function throws out_of_range if the check fails.
648 : */
649 : reference
650 : at(size_type __n)
651 : {
652 : _M_range_check(__n);
653 : return (*this)[__n];
654 : }
655 :
656 : /**
657 : * @brief Provides access to the data contained in the %vector.
658 : * @param n The index of the element for which data should be
659 : * accessed.
660 : * @return Read-only (constant) reference to data.
661 : * @throw std::out_of_range If @a n is an invalid index.
662 : *
663 : * This function provides for safer data access. The parameter
664 : * is first checked that it is in the range of the vector. The
665 : * function throws out_of_range if the check fails.
666 : */
667 : const_reference
668 : at(size_type __n) const
669 : {
670 : _M_range_check(__n);
671 : return (*this)[__n];
672 : }
673 :
674 : /**
675 : * Returns a read/write reference to the data at the first
676 : * element of the %vector.
677 : */
678 : reference
679 0 : front()
680 0 : { return *begin(); }
681 :
682 : /**
683 : * Returns a read-only (constant) reference to the data at the first
684 : * element of the %vector.
685 : */
686 : const_reference
687 : front() const
688 : { return *begin(); }
689 :
690 : /**
691 : * Returns a read/write reference to the data at the last
692 : * element of the %vector.
693 : */
694 : reference
695 0 : back()
696 0 : { return *(end() - 1); }
697 :
698 : /**
699 : * Returns a read-only (constant) reference to the data at the
700 : * last element of the %vector.
701 : */
702 : const_reference
703 9852868 : back() const
704 9852868 : { return *(end() - 1); }
705 :
706 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
707 : // DR 464. Suggestion for new member functions in standard containers.
708 : // data access
709 : /**
710 : * Returns a pointer such that [data(), data() + size()) is a valid
711 : * range. For a non-empty %vector, data() == &front().
712 : */
713 : pointer
714 : data()
715 : { return pointer(this->_M_impl._M_start); }
716 :
717 : const_pointer
718 : data() const
719 : { return const_pointer(this->_M_impl._M_start); }
720 :
721 : // [23.2.4.3] modifiers
722 : /**
723 : * @brief Add data to the end of the %vector.
724 : * @param x Data to be added.
725 : *
726 : * This is a typical stack operation. The function creates an
727 : * element at the end of the %vector and assigns the given data
728 : * to it. Due to the nature of a %vector this operation can be
729 : * done in constant time if the %vector has preallocated space
730 : * available.
731 : */
732 : void
733 1552205 : push_back(const value_type& __x)
734 : {
735 1552205 : if (this->_M_impl._M_finish != this->_M_impl._M_end_of_storage)
736 : {
737 23763 : this->_M_impl.construct(this->_M_impl._M_finish, __x);
738 23763 : ++this->_M_impl._M_finish;
739 : }
740 : else
741 1528442 : _M_insert_aux(end(), __x);
742 1552207 : }
743 :
744 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
745 : void
746 : push_back(value_type&& __x)
747 : { emplace_back(std::move(__x)); }
748 :
749 : template<typename... _Args>
750 : void
751 : emplace_back(_Args&&... __args);
752 : #endif
753 :
754 : /**
755 : * @brief Removes last element.
756 : *
757 : * This is a typical stack operation. It shrinks the %vector by one.
758 : *
759 : * Note that no data is returned, and if the last element's
760 : * data is needed, it should be retrieved before pop_back() is
761 : * called.
762 : */
763 : void
764 0 : pop_back()
765 : {
766 0 : --this->_M_impl._M_finish;
767 0 : this->_M_impl.destroy(this->_M_impl._M_finish);
768 0 : }
769 :
770 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
771 : /**
772 : * @brief Inserts an object in %vector before specified iterator.
773 : * @param position An iterator into the %vector.
774 : * @param args Arguments.
775 : * @return An iterator that points to the inserted data.
776 : *
777 : * This function will insert an object of type T constructed
778 : * with T(std::forward<Args>(args)...) before the specified location.
779 : * Note that this kind of operation could be expensive for a %vector
780 : * and if it is frequently used the user should consider using
781 : * std::list.
782 : */
783 : template<typename... _Args>
784 : iterator
785 : emplace(iterator __position, _Args&&... __args);
786 : #endif
787 :
788 : /**
789 : * @brief Inserts given value into %vector before specified iterator.
790 : * @param position An iterator into the %vector.
791 : * @param x Data to be inserted.
792 : * @return An iterator that points to the inserted data.
793 : *
794 : * This function will insert a copy of the given value before
795 : * the specified location. Note that this kind of operation
796 : * could be expensive for a %vector and if it is frequently
797 : * used the user should consider using std::list.
798 : */
799 : iterator
800 : insert(iterator __position, const value_type& __x);
801 :
802 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
803 : /**
804 : * @brief Inserts given rvalue into %vector before specified iterator.
805 : * @param position An iterator into the %vector.
806 : * @param x Data to be inserted.
807 : * @return An iterator that points to the inserted data.
808 : *
809 : * This function will insert a copy of the given rvalue before
810 : * the specified location. Note that this kind of operation
811 : * could be expensive for a %vector and if it is frequently
812 : * used the user should consider using std::list.
813 : */
814 : iterator
815 : insert(iterator __position, value_type&& __x)
816 : { return emplace(__position, std::move(__x)); }
817 :
818 : /**
819 : * @brief Inserts an initializer_list into the %vector.
820 : * @param position An iterator into the %vector.
821 : * @param l An initializer_list.
822 : *
823 : * This function will insert copies of the data in the
824 : * initializer_list @a l into the %vector before the location
825 : * specified by @a position.
826 : *
827 : * Note that this kind of operation could be expensive for a
828 : * %vector and if it is frequently used the user should
829 : * consider using std::list.
830 : */
831 : void
832 : insert(iterator __position, initializer_list<value_type> __l)
833 : { this->insert(__position, __l.begin(), __l.end()); }
834 : #endif
835 :
836 : /**
837 : * @brief Inserts a number of copies of given data into the %vector.
838 : * @param position An iterator into the %vector.
839 : * @param n Number of elements to be inserted.
840 : * @param x Data to be inserted.
841 : *
842 : * This function will insert a specified number of copies of
843 : * the given data before the location specified by @a position.
844 : *
845 : * Note that this kind of operation could be expensive for a
846 : * %vector and if it is frequently used the user should
847 : * consider using std::list.
848 : */
849 : void
850 0 : insert(iterator __position, size_type __n, const value_type& __x)
851 0 : { _M_fill_insert(__position, __n, __x); }
852 :
853 : /**
854 : * @brief Inserts a range into the %vector.
855 : * @param position An iterator into the %vector.
856 : * @param first An input iterator.
857 : * @param last An input iterator.
858 : *
859 : * This function will insert copies of the data in the range
860 : * [first,last) into the %vector before the location specified
861 : * by @a pos.
862 : *
863 : * Note that this kind of operation could be expensive for a
864 : * %vector and if it is frequently used the user should
865 : * consider using std::list.
866 : */
867 : template<typename _InputIterator>
868 : void
869 0 : insert(iterator __position, _InputIterator __first,
870 : _InputIterator __last)
871 : {
872 : // Check whether it's an integral type. If so, it's not an iterator.
873 : typedef typename std::__is_integer<_InputIterator>::__type _Integral;
874 0 : _M_insert_dispatch(__position, __first, __last, _Integral());
875 0 : }
876 :
877 : /**
878 : * @brief Remove element at given position.
879 : * @param position Iterator pointing to element to be erased.
880 : * @return An iterator pointing to the next element (or end()).
881 : *
882 : * This function will erase the element at the given position and thus
883 : * shorten the %vector by one.
884 : *
885 : * Note This operation could be expensive and if it is
886 : * frequently used the user should consider using std::list.
887 : * The user is also cautioned that this function only erases
888 : * the element, and that if the element is itself a pointer,
889 : * the pointed-to memory is not touched in any way. Managing
890 : * the pointer is the user's responsibility.
891 : */
892 : iterator
893 : erase(iterator __position);
894 :
895 : /**
896 : * @brief Remove a range of elements.
897 : * @param first Iterator pointing to the first element to be erased.
898 : * @param last Iterator pointing to one past the last element to be
899 : * erased.
900 : * @return An iterator pointing to the element pointed to by @a last
901 : * prior to erasing (or end()).
902 : *
903 : * This function will erase the elements in the range [first,last) and
904 : * shorten the %vector accordingly.
905 : *
906 : * Note This operation could be expensive and if it is
907 : * frequently used the user should consider using std::list.
908 : * The user is also cautioned that this function only erases
909 : * the elements, and that if the elements themselves are
910 : * pointers, the pointed-to memory is not touched in any way.
911 : * Managing the pointer is the user's responsibility.
912 : */
913 : iterator
914 : erase(iterator __first, iterator __last);
915 :
916 : /**
917 : * @brief Swaps data with another %vector.
918 : * @param x A %vector of the same element and allocator types.
919 : *
920 : * This exchanges the elements between two vectors in constant time.
921 : * (Three pointers, so it should be quite fast.)
922 : * Note that the global std::swap() function is specialized such that
923 : * std::swap(v1,v2) will feed to this function.
924 : */
925 : void
926 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
927 : swap(vector&& __x)
928 : #else
929 : swap(vector& __x)
930 : #endif
931 : {
932 : std::swap(this->_M_impl._M_start, __x._M_impl._M_start);
933 : std::swap(this->_M_impl._M_finish, __x._M_impl._M_finish);
934 : std::swap(this->_M_impl._M_end_of_storage,
935 : __x._M_impl._M_end_of_storage);
936 :
937 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
938 : // 431. Swapping containers with unequal allocators.
939 : std::__alloc_swap<_Tp_alloc_type>::_S_do_it(_M_get_Tp_allocator(),
940 : __x._M_get_Tp_allocator());
941 : }
942 :
943 : /**
944 : * Erases all the elements. Note that this function only erases the
945 : * elements, and that if the elements themselves are pointers, the
946 : * pointed-to memory is not touched in any way. Managing the pointer is
947 : * the user's responsibility.
948 : */
949 : void
950 163 : clear()
951 163 : { _M_erase_at_end(this->_M_impl._M_start); }
952 :
953 : protected:
954 : /**
955 : * Memory expansion handler. Uses the member allocation function to
956 : * obtain @a n bytes of memory, and then copies [first,last) into it.
957 : */
958 : template<typename _ForwardIterator>
959 : pointer
960 0 : _M_allocate_and_copy(size_type __n,
961 : _ForwardIterator __first, _ForwardIterator __last)
962 : {
963 0 : pointer __result = this->_M_allocate(__n);
964 : __try
965 : {
966 0 : std::__uninitialized_copy_a(__first, __last, __result,
967 : _M_get_Tp_allocator());
968 0 : return __result;
969 : }
970 0 : __catch(...)
971 : {
972 0 : _M_deallocate(__result, __n);
973 0 : __throw_exception_again;
974 : }
975 : }
976 :
977 :
978 : // Internal constructor functions follow.
979 :
980 : // Called by the range constructor to implement [23.1.1]/9
981 :
982 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
983 : // 438. Ambiguity in the "do the right thing" clause
984 : template<typename _Integer>
985 : void
986 0 : _M_initialize_dispatch(_Integer __n, _Integer __value, __true_type)
987 : {
988 0 : this->_M_impl._M_start = _M_allocate(static_cast<size_type>(__n));
989 0 : this->_M_impl._M_end_of_storage =
990 : this->_M_impl._M_start + static_cast<size_type>(__n);
991 0 : _M_fill_initialize(static_cast<size_type>(__n), __value);
992 0 : }
993 :
994 : // Called by the range constructor to implement [23.1.1]/9
995 : template<typename _InputIterator>
996 : void
997 99456 : _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
998 : __false_type)
999 : {
1000 : typedef typename std::iterator_traits<_InputIterator>::
1001 : iterator_category _IterCategory;
1002 99456 : _M_range_initialize(__first, __last, _IterCategory());
1003 99456 : }
1004 :
1005 : // Called by the second initialize_dispatch above
1006 : template<typename _InputIterator>
1007 : void
1008 : _M_range_initialize(_InputIterator __first,
1009 : _InputIterator __last, std::input_iterator_tag)
1010 : {
1011 : for (; __first != __last; ++__first)
1012 : push_back(*__first);
1013 : }
1014 :
1015 : // Called by the second initialize_dispatch above
1016 : template<typename _ForwardIterator>
1017 : void
1018 99456 : _M_range_initialize(_ForwardIterator __first,
1019 : _ForwardIterator __last, std::forward_iterator_tag)
1020 : {
1021 99456 : const size_type __n = std::distance(__first, __last);
1022 99456 : this->_M_impl._M_start = this->_M_allocate(__n);
1023 99456 : this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
1024 99456 : this->_M_impl._M_finish =
1025 : std::__uninitialized_copy_a(__first, __last,
1026 : this->_M_impl._M_start,
1027 : _M_get_Tp_allocator());
1028 99456 : }
1029 :
1030 : // Called by the first initialize_dispatch above and by the
1031 : // vector(n,value,a) constructor.
1032 : void
1033 0 : _M_fill_initialize(size_type __n, const value_type& __value)
1034 : {
1035 0 : std::__uninitialized_fill_n_a(this->_M_impl._M_start, __n, __value,
1036 : _M_get_Tp_allocator());
1037 0 : this->_M_impl._M_finish = this->_M_impl._M_end_of_storage;
1038 0 : }
1039 :
1040 :
1041 : // Internal assign functions follow. The *_aux functions do the actual
1042 : // assignment work for the range versions.
1043 :
1044 : // Called by the range assign to implement [23.1.1]/9
1045 :
1046 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1047 : // 438. Ambiguity in the "do the right thing" clause
1048 : template<typename _Integer>
1049 : void
1050 : _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1051 : { _M_fill_assign(__n, __val); }
1052 :
1053 : // Called by the range assign to implement [23.1.1]/9
1054 : template<typename _InputIterator>
1055 : void
1056 : _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1057 : __false_type)
1058 : {
1059 : typedef typename std::iterator_traits<_InputIterator>::
1060 : iterator_category _IterCategory;
1061 : _M_assign_aux(__first, __last, _IterCategory());
1062 : }
1063 :
1064 : // Called by the second assign_dispatch above
1065 : template<typename _InputIterator>
1066 : void
1067 : _M_assign_aux(_InputIterator __first, _InputIterator __last,
1068 : std::input_iterator_tag);
1069 :
1070 : // Called by the second assign_dispatch above
1071 : template<typename _ForwardIterator>
1072 : void
1073 : _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1074 : std::forward_iterator_tag);
1075 :
1076 : // Called by assign(n,t), and the range assign when it turns out
1077 : // to be the same thing.
1078 : void
1079 : _M_fill_assign(size_type __n, const value_type& __val);
1080 :
1081 :
1082 : // Internal insert functions follow.
1083 :
1084 : // Called by the range insert to implement [23.1.1]/9
1085 :
1086 : // _GLIBCXX_RESOLVE_LIB_DEFECTS
1087 : // 438. Ambiguity in the "do the right thing" clause
1088 : template<typename _Integer>
1089 : void
1090 : _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
1091 : __true_type)
1092 : { _M_fill_insert(__pos, __n, __val); }
1093 :
1094 : // Called by the range insert to implement [23.1.1]/9
1095 : template<typename _InputIterator>
1096 : void
1097 0 : _M_insert_dispatch(iterator __pos, _InputIterator __first,
1098 : _InputIterator __last, __false_type)
1099 : {
1100 : typedef typename std::iterator_traits<_InputIterator>::
1101 : iterator_category _IterCategory;
1102 0 : _M_range_insert(__pos, __first, __last, _IterCategory());
1103 0 : }
1104 :
1105 : // Called by the second insert_dispatch above
1106 : template<typename _InputIterator>
1107 : void
1108 : _M_range_insert(iterator __pos, _InputIterator __first,
1109 : _InputIterator __last, std::input_iterator_tag);
1110 :
1111 : // Called by the second insert_dispatch above
1112 : template<typename _ForwardIterator>
1113 : void
1114 : _M_range_insert(iterator __pos, _ForwardIterator __first,
1115 : _ForwardIterator __last, std::forward_iterator_tag);
1116 :
1117 : // Called by insert(p,n,x), and the range insert when it turns out to be
1118 : // the same thing.
1119 : void
1120 : _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
1121 :
1122 : // Called by insert(p,x)
1123 : #ifndef __GXX_EXPERIMENTAL_CXX0X__
1124 : void
1125 : _M_insert_aux(iterator __position, const value_type& __x);
1126 : #else
1127 : template<typename... _Args>
1128 : void
1129 : _M_insert_aux(iterator __position, _Args&&... __args);
1130 : #endif
1131 :
1132 : // Called by the latter.
1133 : size_type
1134 1528443 : _M_check_len(size_type __n, const char* __s) const
1135 : {
1136 1528443 : if (max_size() - size() < __n)
1137 0 : __throw_length_error(__N(__s));
1138 :
1139 1528445 : const size_type __len = size() + std::max(size(), __n);
1140 1528445 : return (__len < size() || __len > max_size()) ? max_size() : __len;
1141 : }
1142 :
1143 : // Internal erase functions follow.
1144 :
1145 : // Called by erase(q1,q2), clear(), resize(), _M_fill_assign,
1146 : // _M_assign_aux.
1147 : void
1148 163 : _M_erase_at_end(pointer __pos)
1149 : {
1150 163 : std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
1151 163 : this->_M_impl._M_finish = __pos;
1152 163 : }
1153 : };
1154 :
1155 :
1156 : /**
1157 : * @brief Vector equality comparison.
1158 : * @param x A %vector.
1159 : * @param y A %vector of the same type as @a x.
1160 : * @return True iff the size and elements of the vectors are equal.
1161 : *
1162 : * This is an equivalence relation. It is linear in the size of the
1163 : * vectors. Vectors are considered equivalent if their sizes are equal,
1164 : * and if corresponding elements compare equal.
1165 : */
1166 : template<typename _Tp, typename _Alloc>
1167 : inline bool
1168 : operator==(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1169 : { return (__x.size() == __y.size()
1170 : && std::equal(__x.begin(), __x.end(), __y.begin())); }
1171 :
1172 : /**
1173 : * @brief Vector ordering relation.
1174 : * @param x A %vector.
1175 : * @param y A %vector of the same type as @a x.
1176 : * @return True iff @a x is lexicographically less than @a y.
1177 : *
1178 : * This is a total ordering relation. It is linear in the size of the
1179 : * vectors. The elements must be comparable with @c <.
1180 : *
1181 : * See std::lexicographical_compare() for how the determination is made.
1182 : */
1183 : template<typename _Tp, typename _Alloc>
1184 : inline bool
1185 : operator<(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1186 : { return std::lexicographical_compare(__x.begin(), __x.end(),
1187 : __y.begin(), __y.end()); }
1188 :
1189 : /// Based on operator==
1190 : template<typename _Tp, typename _Alloc>
1191 : inline bool
1192 : operator!=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1193 : { return !(__x == __y); }
1194 :
1195 : /// Based on operator<
1196 : template<typename _Tp, typename _Alloc>
1197 : inline bool
1198 : operator>(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1199 : { return __y < __x; }
1200 :
1201 : /// Based on operator<
1202 : template<typename _Tp, typename _Alloc>
1203 : inline bool
1204 : operator<=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1205 : { return !(__y < __x); }
1206 :
1207 : /// Based on operator<
1208 : template<typename _Tp, typename _Alloc>
1209 : inline bool
1210 : operator>=(const vector<_Tp, _Alloc>& __x, const vector<_Tp, _Alloc>& __y)
1211 : { return !(__x < __y); }
1212 :
1213 : /// See std::vector::swap().
1214 : template<typename _Tp, typename _Alloc>
1215 : inline void
1216 : swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>& __y)
1217 : { __x.swap(__y); }
1218 :
1219 : #ifdef __GXX_EXPERIMENTAL_CXX0X__
1220 : template<typename _Tp, typename _Alloc>
1221 : inline void
1222 : swap(vector<_Tp, _Alloc>&& __x, vector<_Tp, _Alloc>& __y)
1223 : { __x.swap(__y); }
1224 :
1225 : template<typename _Tp, typename _Alloc>
1226 : inline void
1227 : swap(vector<_Tp, _Alloc>& __x, vector<_Tp, _Alloc>&& __y)
1228 : { __x.swap(__y); }
1229 : #endif
1230 :
1231 : _GLIBCXX_END_NESTED_NAMESPACE
1232 :
1233 : #endif /* _STL_VECTOR_H */
|