简单的vector实现

学习c++中,看完书后,最近苦于不知道下一步该怎么办了,就翻翻STL源码剖析中的各种容器,想重新实现一遍。很多问题之前看的时候还不知道是怎么回事,当自己写的时候才发现许多应该注意与理解的。这个vector类写得特别简单,只实现了其中的一部分功能,因为没有使用iterator,发现一些函数不太好写,而且封装性极差,同时,只能存放内置类型。在这些问题中,希望自己以后会好好重写一下。

这个程序有点小情况,进行插入操作时,在VC++6.0下运行是正常的,在codeblocks下最后一个数却是乱的,但是在codeblocks下进行调试时又是正常的,前面写了一个关于跳表的程序也是这样,都快疯了,要是有人知道原因,求告知。

Vector.h

#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
#include <cstdlib>
/**
* 实现中只能处理内置类型T
*/

namespace flysnow{
template<class T>
class Vector {
public:
    T* start;
    T* finish;
    T* end_of_storage;
    //void alloc
public:
    Vector():start(NULL),finish(NULL),end_of_storage(NULL) {}
    Vector(size_t n,const T& value);
    //Vector(int n,const T& value);
    //Vector(long n,const T& value);
    explicit Vector(size_t n);
    ~Vector() {free(start);} //在这里发现得判断是内置类型还是class,这里只支持内置类型
    T& front() {return *start;}
    T& back() {return *finish;}

    void push_back(const T& t);
    void pop_back();
    T* erase(T* position);
    T* erase(T* position,size_t n);
    void insert(T* pos,size_t n,const T& x);
    size_t size() {return finish-start;}
    bool empty() {return start == finish;}
    void resize(size_t n,const T& x);
    void resize(size_t n);
    void clear();
    size_t capacity() {return end_of_storage-start;}
    T& operator[] (size_t index) {return *(start+index);}
    T* get_pointer() {return start;}
};

template<class T>
Vector<T>::Vector(size_t n,const T& value)
{
    start = (T*)malloc(n*sizeof(T));
    finish = start + n;
    end_of_storage = finish;
    for(size_t i=0; i<n; i++) {
        start[i] = value;
    }
}

template<class T>
Vector<T>::Vector(size_t n)
{
    start = (T*)malloc(n*sizeof(T));
    finish = start + n;
    end_of_storage = finish;
    for(int i=0; i<n; i++) {
        //start[i] = T();
        start[i] = 0;
    }
}

template<class T>
void Vector<T>::push_back(const T& t)
{
    if(end_of_storage != finish) {
        *finish = t;
        ++finish;
    } else {
        size_t old_size = size();
        size_t new_size = old_size?(2*old_size):1;
        T* new_start = (T*)malloc(new_size*sizeof(T));
        for(size_t i=0; i<old_size; i++) {
            *(new_start+i) = *(start+i);
        }
        *(new_start+old_size) = t;
        start = new_start;
        finish = start + old_size + 1;
        end_of_storage = start + new_size;
    }
}

template<class T>
void Vector<T>::pop_back()
{
    if(empty()) {
        return ;
    }
    --finish;
   // finish->~T();
}
template<class T>
T* Vector<T>::erase(T* pos)
{
    T* temp = pos;
    while(pos != finish-1) {
        *pos = *(pos+1);
        pos++;
    }
    --finish;
    return temp;
}

template<class T>
T* Vector<T>::erase(T* pos,size_t n)
{
    T*p = pos+n;
    T* result = pos;
    if(p >= finish) {
        n = finish-pos+1;
        erase(pos,n);
    } else {
        while(p < finish) {
            *pos++ = *p++;
        }
        finish -= n;
    }
    return result;
}

template<class T>
void Vector<T>::insert(T* pos,size_t n,const T& x)
{
	size_t i;
    size_t old_size = size();
    size_t index = pos-start;
    if(n <= end_of_storage-finish+1) {
        for( i=old_size-1;i>=index;i--) {
            start[i+n] = start[i];
        }
        while(pos <= start+index+n-1) {
            *pos++ = x;
        }

        finish += n;
        std::cout<<*(finish-1)<<std::endl;
        for( i=0;i<size();i++)
            std::cout<<start[i]<<' ';
        std::cout<<std::endl;
    } else {
        size_t new_size = old_size;
        new_size += old_size>n?old_size:n;
        T* new_start = (T*)malloc(new_size*sizeof(T));
        for( i=0;i<old_size;i++) {
            new_start[i] = start[i];
        }
        start = new_start;
        finish = start + old_size;
        end_of_storage = start + new_size;
        insert(start+index,n,x);
    }
}
template<class T>
void Vector<T>::resize(size_t n,const T& x)
{
    size_t old_size = size();
    if(n <= old_size) {
        erase(start+n,old_size-n);
    } else if(n <= capacity()){
        for(int i=old_size;i<n;i++) {
            start[i] = x;
        }
        finish = start + n;
    } else {
        size_t new_size =old_size + old_size > n?old_size:n;
        T* new_start = (T*)malloc(new_size*sizeof(T));
        for(int i=0;i<old_size;i++) {
            new_start[i] = start[i];
        }
        start = new_start;
        finish = start + old_size;
        end_of_storage = start + new_size;
        resize(n,x);
    }
}
template<class T>
void Vector<T>::resize(size_t n)
{
    resize(n,0);
}
template<class T>
void Vector<T>::clear()
{
    free(start);
    start = NULL;
    finish = NULL;
    end_of_storage = NULL;
}

}

#endif

main.cpp

#include <iostream>
#include "Vector.h"
using namespace std;

int main()
{
    flysnow::Vector<int> vec;
    vec.push_back(4);
    vec.push_back(5);
    vec.push_back(9);
    vec.push_back(4);
    vec.push_back(2);
    vec.insert(vec.get_pointer()+2,4,10);
   // for(size_t i=0;i<vec.size();i++)
   //     cout<<vec[i]<<' ';
   // cout<<endl;
    vec.insert(vec.get_pointer()+1,1,11);
    cout<<*(vec.erase(vec.get_pointer()+4,3))<<endl;
   // cout<<*(vec.finish-1)<<endl;
    for(size_t i=0;i<vec.size();i++)
        cout<<vec[i]<<' ';
    cout<<endl;
    return 0;
}
时间: 2024-10-10 11:31:17

简单的vector实现的相关文章

从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

【转】 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<algorithm>//貌似可以不用,但最好加上. using namespace std

转载 从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法

转载自:http://www.cnblogs.com/cj695/p/3863142.html sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<

自己动手实现简单的Vector

看到今天,终于自己动手写了一个自己的vector,我这个版本的vector只有vector主要的一些操作,包括原版vector的所有构造函数,begin(),end(),size(),capacity(),empty(),erase(),clear(),pop_back,push_back(),重载了[],==,!=操作符等.其中有个比较重要的insert(),我暂时没写.其实和push_back差不多,只不过考虑的条件更多,代码更复杂,逻辑并不难.废话不多说,现将我的vector代码贴出来:

C++线性序列容器&lt;vector&gt;简单总结

C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除元素,比数组操作高效. 头文件:#include <vector> 命名空间:using namespace std:vector 构造函数 vector<int>vec_int;         // 创建一个整形元素的vector vector<string>vec_s

Java之集合(四)Vector和Stack

转载请注明源出处:http://www.cnblogs.com/lighten/p/7296023.html 1.前言 本章介绍Java集合List中的Vector和其子类Stack.Vector类是Java 1.0就提供的一个集合类,其实现和上章讲解的ArrayList几乎一样,在下面会简单介绍一下(不然就没有可说的了),其子类Stack是一个程序员都比较熟悉的栈结构,特点就是先入后出,Stack其实也较为简单,会简单描述一下. 2.Vector 在前言中也谈到了Vector与ArrayLis

vector有序插入

实现了简单的vector有序插入,这个题目值得注意的点是1.当vector为空时,需要判断再排除 2.迭代器的使用是此段代码的特点 int insertVector(vector<int> & L, int k){ if(L.empty()){ L.push_back(k); return 0; } else if(k<L.front()){ L.insert(L.begin(),k); return 0; } else if(k>L.back()){ L.push_bac

把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin

vector中sort用法到自定义比较函数comp

从最简单的vector中sort用法到自定义比较函数comp后对结构体排序的sort算法 sort函数在使用中非常好用,也非常简单,而且效率与冒泡或者选择排序不是一个数量级.本文就sort函数在vector中的用法分为sort函数入门用法与自定义comp比较函数比较结构体这两个最基本的功能讲讲其用法: 1.sort入门: 使用sort需要包含algorithm头文件,完整代码如下 #include<iostream> #include<vector> #include<alg