vector.hpp
来自「MySQL源码文件5.X系列, 可自已编译到服务器」· HPP 代码 · 共 155 行
HPP
155 行
/* Copyright (C) 2000-2007 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.*//* mySTL vector implements simple vector, w/ swap * */#ifndef mySTL_VECTOR_HPP#define mySTL_VECTOR_HPP#include "helpers.hpp" // construct, destory, fill, etc.#include "algorithm.hpp" // swap#include <assert.h> // assertnamespace mySTL {template <typename T>struct vector_base { T* start_; T* finish_; T* end_of_storage_; vector_base() : start_(0), finish_(0), end_of_storage_(0) {} vector_base(size_t n) { start_ = GetArrayMemory<T>(n); finish_ = start_; end_of_storage_ = start_ + n; } ~vector_base() { FreeArrayMemory(start_); } void Swap(vector_base& that) { swap(start_, that.start_); swap(finish_, that.finish_); swap(end_of_storage_, that.end_of_storage_); }};template <typename T>class vector {public: typedef T* iterator; typedef const T* const_iterator; vector() {} explicit vector(size_t n) : vec_(n) { vec_.finish_ = uninit_fill_n(vec_.start_, n, T()); } ~vector() { destroy(vec_.start_, vec_.finish_); } vector(const vector& other) : vec_(other.size()) { vec_.finish_ = uninit_copy(other.vec_.start_, other.vec_.finish_, vec_.start_); } size_t capacity() const { return vec_.end_of_storage_ - vec_.start_; } size_t size() const { return vec_.finish_ - vec_.start_; } T& operator[](size_t idx) { return *(vec_.start_ + idx); } const T& operator[](size_t idx) const { return *(vec_.start_ + idx); } const T* begin() const { return vec_.start_; } const T* end() const { return vec_.finish_; } void push_back(const T& v) { if (vec_.finish_ != vec_.end_of_storage_) { construct(vec_.finish_, v); ++vec_.finish_; } else { vector tmp(size() * 2 + 1, *this); construct(tmp.vec_.finish_, v); ++tmp.vec_.finish_; Swap(tmp); } } void resize(size_t n, const T& v) { if (n == size()) return; if (n < size()) { T* first = vec_.start_ + n; destroy(first, vec_.finish_); vec_.finish_ -= vec_.finish_ - first; } else { vector tmp(n, *this); tmp.vec_.finish_ = uninit_fill_n(tmp.vec_.finish_, n - size(), v); Swap(tmp); } } void reserve(size_t n) { if (capacity() < n) { vector tmp(n, *this); Swap(tmp); } } void Swap(vector& that) { vec_.Swap(that.vec_); }private: vector_base<T> vec_; vector& operator=(const vector&); // hide assign // for growing, n must be bigger than other size vector(size_t n, const vector& other) : vec_(n) { assert(n > other.size()); vec_.finish_ = uninit_copy(other.vec_.start_, other.vec_.finish_, vec_.start_); }};} // namespace mySTL#endif // mySTL_VECTOR_HPP
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?