vector实现

typedef int size_type;
/*
vector维护的是一个连续线性空间,提供的迭代器是Random Access Iterators即普通指针
*/
template <class T,class Alloc=alloc>
class vector
{
protected:
    iterator start;//目前使用空间的头
    iterator finish;//目前使用空间的尾
    iterator end_of_storage;//目前可用空间的尾
public:
    void push_back(const T& x);
    void insert_aux(iterator position, const T& x);
    int size()const{ return int(end() - begin()); }
};

/*
vector动态增加大小,并不是在原空间之后开辟新空间,因为无法保证原空间之后尚有可供配置的空间,而是以
原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间
*/
template<class T,class Alloc=alloc>
void vector::push_back(const T& x)
{
    if (finish != end_of_storage)
    {
        construct(finish, x);
        ++finish;
    }
    else//已无备用空间
        insert_aux(end(), x);
}

template<class T, class Alloc = alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x)
{
    const size_type old_size = size();
    const size_type len = old_size != 0 ? 2 * old_size : 1;
    /*
    配置原则:若原空间大小为0,则配置一个元素大小,否则配置原大小的两倍
    前半段用来放置原数据,后半段用来放置新数据
    */
    //data_allocator为vector专有的空间配置器
    iterator new_start = data_allocator::allocate(len);
    iterator new_finish = new_start;
    //将原vector的内容拷贝到新vector
    new_finish = uninitialized_copy(start, position, new_start);
    //为新元素设定初值x
    construct(new_finish, x);
    ++new_finish;

    //析构并释放原vector
    destroy(begin(), end());
    deallocate();

    //调整迭代器
    start = new_start;
    finish = new_finish;
    end_of_storage = new_start + len;
}
时间: 2024-08-30 08:38:17

vector实现的相关文章

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

初译 Support Vector Machines:A Simple Tutorial(一)

从本次开始我将开始尝试着逐章翻译一下 Alexey Nefedov的<Support Vector Machines:A Simple Tutorial>这本教材,这可是我们导师极力推荐的SVM教材,看了好久一直感觉一脸懵逼,索性开坑翻译一下吧,也当是加深理解,毕竟我也是一知半解,如果翻译的有不对的地方还望大佬们斧正,欢迎提意见,欢迎讨论. 嗯,就是这样. (一)Introduction 在本章节中将会介绍一些用于定义支持向量机(SVM)的基础的概念,这些概念对于理解SVM至关重要,假定读者了

Vector容器 和 iteration 迭代器

vector容器 vector是同一种类型的对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库负责管理存储元素的相关内存.我们把vector称为容器,是因为它可以包含其他对象.一个容器中的所有对象都必须是同一种类型的. 使用vector之前,必须包含相应的头文件.#include <vector> using std::vector; vector是一个类模板(class template).模板允许程序员编写单个类或函数定义,这个类和函数定义可用于不同的数据类型上.

C++ vector 使用

看vector 的使用: #include "stdafx.h" #include <iostream> #include <vector> using namespace std; int main() { vector<long> v; for (long i=0;i<10000;i++) { v.push_back(rand()); } cout << "size = " << v.size()

Vector Tile

Mapbox Vector Tile Specification A specification for encoding tiled vector data. <?XML:NAMESPACE PREFIX = "[default] http://www.w3.org/2000/svg" NS = "http://www.w3.org/2000/svg" />License The text of this specification is licens

vector,deque,list相关操作

1.vector的基本操作 (1).对动态数组元素的添加和删除.获取 代码如下: #include<iostream> #include<vector> using namespace std; //数组元素的添加和删除.获取 int main(void){     vector<int> v1;      v1.push_back(1);     v1.push_back(2);     v1.push_back(3);     cout<<"l

vector容器用法详解

vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组.像数组一样,vector类也用从0开始的下标表示元素的位置:但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化. vector类常用的函数如下所示: 1.构造函数 vector():创建一个空vector vector(int nSize):创建一个vector,元素个数为nSize vector(int nSize,const t& t):创建一个vector,元

C++使用vector

#include <iostream> #include <string> #include <vector> using namespace std; void show(vector<int> v) { for(auto v1 : v){ cout << v1 << endl; } } void show2(vector<int> v) { for(vector<int>::const_iterator v

C++ STL学习——vector

学过C++的人肯定会很熟悉STL标准模板库,STL其实就是封装了一系列的接口,供我们调用.很多函数或者算法的实现不需要我们从头开始写,大大提高我们的编程效率.这篇博客在简单介绍STL的情况下,会详细的来介绍vector的使用. STL共有六大组件: 一.容器(Container):是一种数据结构,如list,vector,deque,queue等,以模板类的方法提供,为了访问容器中的数据,可以使用由容器类提供的迭代器. 二.迭代器(Iterator):提供了访问容器中对象的方法. 三.算法(Al

stl容器区别: vector list deque set map及底层实现

在STL中基本容器有: vector.list.deque.set.map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set :集合, 用来判断某一个元素是不是在一个组里面,使用的比较少 map :映射,相当于字典 ,把一个值映射成另一个值,如果想创建字典的话使用它好了 底层采用的是树型结构,多数使用平衡二叉树实现 ,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响. vector.list.dequ