C++中vector的实现
来源:互联网 发布:网络政治参与哪些平台 编辑:程序博客网 时间:2024/05/21 06:02
注意几点:
分配内存不要使用new和delete,因为new的同时就把对象构造了,而我们需要的是原始内存。
所以应该使用标准库提供的allocator类来实现内存的控制。当然也可以重载operator new操作符,因为二者都是使用malloc作为底层实现,所以直接采用malloc也可以。
对象的复制必须使用系统提供的uninitialized_fill和uninitialized_copy,因为我们无法手工调用构造函数。
对于C++中的对象,除了POD之外,使用memcpy系列的函数是绝对错误的。
myvector.h
#ifndef _VECTOR_H_#define _VECTOR_H_#include <stddef.h>#include <algorithm>#include <memory>template <typename T>class Vector{ public: typedef T *iterator; typedef const T *const_iterator; typedef size_t size_type; typedef T value_type; class reverse_iterator { public: reverse_iterator(iterator it = NULL):current_(it) {} iterator base() const { return current_; } reverse_iterator &operator++()//前置 { --current_; return *this; } reverse_iterator operator++(int)//后置 { reverse_iterator temp(*this); --current_; return temp; } reverse_iterator &operator--() { ++current_; return *this; } reverse_iterator operator--(int) { reverse_iterator temp(*this); ++current_; return temp; } T &operator*() { iterator temp = current_; return *--temp; } T *operator->() { iterator temp = current_; return --temp; } friend bool operator==(const reverse_iterator &lhs, const reverse_iterator &rhs) { return lhs.current_ == rhs.current_; } friend bool operator!=(const reverse_iterator &lhs, const reverse_iterator &rhs) { return lhs.current_ != rhs.current_; } private: iterator current_; }; Vector() { create(); }//无参构造函数 explicit Vector(size_type n, const T &t = T()) { create(n, t); } Vector(const Vector &v) { create(v.begin(), v.end());}// 拷贝构造函数 ~Vector() { uncreate();} Vector &operator=(const Vector &other); T &operator[] (size_type i) { return data_[i]; } const T &operator[] (size_type i) const {return data_[i]; } void push_back(const T &t); size_type size() const { return avail_ - data_;} size_type capacity()const { return limit_ - data_;} iterator begin() { return data_; } const_iterator begin() const {return data_;} iterator end() {return avail_;} const_iterator end() const { return avail_; } reverse_iterator rbegin(){return reverse_iterator(end());} reverse_iterator rend() {return reverse_iterator(begin());} void swap(Vector &rhs) { std::swap(data_, rhs.data_); std::swap(avail_, rhs.avail_); std::swap(limit_, rhs.limit_); } private: iterator data_;//首元素 iterator avail_;//末尾元素的下一个 iterator limit_; std::allocator<T> alloc_;//内存分配器 void create(); void create(size_type, const T &); void create(const_iterator, const_iterator); void uncreate(); void grow(); void uncheckAppend(const T &);}; template <typename T>inline Vector<T> &Vector<T>::operator=(const Vector &rhs){ if(this != rhs) { uncreate();//释放原来的内存 create(rhs.begin(), rhs.end()); } return *this;} template <typename T>inline void Vector<T>::push_back(const T &t){ if(avail_ == limit_) { grow(); } uncheckAppend(t);} template <typename T>inline void Vector<T>::create(){ //分配空的数组 data_ = avail_ = limit_ = 0;} template <typename T>inline void Vector<T>::create(size_type n, const T &val){ //分配原始内存 data_ = alloc_.allocate(n); limit_ = avail_ = data_ + n; //向原始内存填充元素 std::uninitialized_fill(data_, limit_, val);} template <typename T>inline void Vector<T>::create(const_iterator i, const_iterator j){ data_ = alloc_.allocate(j-i); limit_ = avail_ = std::uninitialized_copy(i, j, data_);} template <typename T>inline void Vector<T>::uncreate(){ if(data_)//逐个析构 { iterator it = avail_; while(it != data_) { alloc_.destroy(--it); } alloc_.deallocate(data_, limit_ - data_ );//真正释放内存 } data_ = limit_ = avail_ = 0;//重置指针} template <typename T>inline void Vector<T>::grow(){ //内存变为2倍 size_type new_size = std::max(2 * (limit_ - data_), std::ptrdiff_t(1)); //分配原始内存 iterator new_data = alloc_.allocate(new_size); //复制元素 iterator new_avail = std::uninitialized_copy(data_, avail_, new_data); uncreate();//释放以前内存 data_ = new_data; avail_ = new_avail; limit_ = data_ + new_size;} template <typename T>inline void Vector<T>::uncheckAppend(const T &val){ alloc_.construct(avail_++, val);}#endif /*VECTOR_H*/
test_main.cpp
#include "myvector.h"#include <iostream>#include <string>using namespace std;void print_reverse(Vector<string> &vec){ cout << "reverse_iterator: " << endl; for(Vector<string>::reverse_iterator it = vec.rbegin(); it != vec.rend(); ++it) { cout << *it << endl; } cout << endl;}void print(Vector<string> &vec){ cout << "iterator: " << endl; for(Vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << endl; } cout << endl;}int main(int argc, const char *argv[]){ Vector<string> vec(3, "hello"); for(Vector<string>::const_iterator it = vec.begin(); it != vec.end(); ++it) { cout << *it << endl; } cout << endl; cout << "size=" << vec.size() << endl; cout << "capacity:" << vec.capacity() << endl; vec.push_back("foo"); vec.push_back("bar"); cout << "size:=" << vec.size() << endl; cout << "capacity=" << vec.capacity() << endl; print_reverse(vec); print(vec); return 0;}
转自:http://www.cnblogs.com/inevermore/p/4003710.html
0 0
- vector的实现【C++】
- C++中vector的实现
- STL中vector的实现
- C++中vector的实现
- java中Vector的实现
- C实现的类似vector的容器
- c/c++ vector 的简单实现
- 基于vector的栈实现(C++)
- Vector 的简单实现 C++11
- [C++]vector 的 push_back实现原理
- (C++)Vector 简单的底层实现
- C++中vector的用法
- C++中vector的用法
- C++STL中vector容器的用法
- C++STL中vector容器的用法
- C++STL中vector容器的用法
- C++STL中vector容器的用法
- C++STL中vector容器的用法
- 可选的查找模式
- 动态内存管理---new&delete
- 安装11g_rac配置等效性
- 51单片机串口通讯
- BeagleBoneBlack上通过nfs/ramdisk加载linux
- C++中vector的实现
- java大学教程第一章笔记
- 【动态规划】LIS最长单调递增子序列 logn算法 并且输出子序列
- acdream 1211 Reactor Cooling 【上下界网络流 + 输出流量】
- spring aop缺包问题汇总
- 空白人生
- 在Linux上配置DRBD部署
- 软工视频(26)-软件维护
- ChromeOS - apk 试玩 (记录)