Vector的使用与简单剖析


STLC++的精华!

我们首先要学会使用:

1.Vector的使用

#include"stdafx.h"

#include<iostream>

#include<vector>

#include<algorithm>

usingnamespacestd;


int_tmain(intargc,_TCHAR*argv[])

{

vector<int>iVec;

iVec.push_back(5); //进行数据的添加

iVec.push_back(1);

iVec.push_back(7);

iVec.push_back(9);

iVec.push_back(3);

iVec.push_back(2);


for(vector<int>::iteratorit= iVec.begin();it!=iVec.end();++it)//使用迭代器

cout<<*it<<" ";

cout<<endl;


sort(iVec.begin(),iVec.end()); //简单使用一下stl中的排序算法


for(vector<int>::iteratorit= iVec.begin();it!=iVec.end();++it)

cout<<*it<<" ";

cout<<endl;


intlen= iVec.size();

for(inti=0;i<len;i++) //使用下标访问操作

cout<<iVec[i]<<" ";

cout<<endl;


iVec.insert(iVec.begin()+2,4); //在第三个位置插入

vector<int>iVec1;

iVec1.push_back(2);

iVec1.push_back(2);

iVec1.push_back(22);

iVec1.push_back(22);

iVec.insert(iVec.end(),iVec1.begin(),iVec1.end()); //iVec1插入到iVec的后面


len= iVec.size();

for(inti=0;i<len;i++) //使用下标访问操作

cout<<iVec.at(i)<<" "; //使用at的显示方式等同于[]

cout<<endl;


/*

stl vactor的三种插入方式

insert(const_iterator pos, const T& val); //pos位置插入val数值

insert(const_iterator pos, size_type n, const T& val)//pos处连续的插入nval数值

insert(const_iterator pos, InputIterator first, InputIterator last)//firstlast之间的数据插入到pos位置

*/


intcapacitySize= iVec.capacity();

cout<<"Thesize is: "<<len<<endl;

cout<<"Thecapacity is: "<<capacitySize<<endl;

getchar();

return0;

}


接下来,我们实现一个简单vector(模仿一下STL)

#include"stdafx.h"

#include<iostream>

usingnamespacestd;


template<classT>

classvector

{

public:

typedefT*m_iterator;

typedefconstT*m_citerator;

typedefT&m_reference;

typedefconstT&m_creference;

staticconstsize_tmaxCapacity= 30; //首先定义最大的数据量

private:

m_iteratorm_begin; //首指针

m_iteratorm_end; //尾指针

size_tm_capacity; //容量

public:

vector()

{

m_capacity= maxCapacity;

m_begin= newT[m_capacity]; //分配的内存是容量的大小而不是size的大小

m_end= m_begin;

}

vector(size_tsize)

{

m_capacity= size>maxCapacity?maxCapacity:size; //获得正确的数量

m_start= newT[m_capacity];

m_end= m_begin;

}

~vector()

{

if(m_begin)

{

deletem_begin;

m_begin= NULL;

m_end= NULL;

m_capacity= 0;

}

}

m_citeratorgetBegin()const

{

returnm_begin;

}

m_iteratorgetBegin()

{

returnm_begin;

}


m_citeratorgetEnd()const

{

returnm_end;

}

m_iteratorgetEnd()

{

returnm_end;

}


size_tgetSize()const

{

return (m_begin==0? 0:(m_end- m_begin));

}


size_tgetCapacity()const

{

return(m_capacity);

}


boolisEmpty()const

{

returnm_begin== m_end;

}

m_citeratoroperator[](size_tpos)const

{

if(pos> m_capacity)

throwout_of_range("查询过界!");

returnm_begin[pos];

}

voidpush_back(constT& val)

{

insert(getEnd(),val);

}

voidpop_back()

{

if(m_end> m_begin)

--m_end;

}


voidinsert(m_iteratorpos,constT&val) //为了简单示例只写一个insert

{

if((size_t)(pos-m_begin+1)>= m_capacity)

reverse(2*m_capacity); //按照STL源码 也是分配倍的大小

*m_end++= val;

}


voidreverse(size_tpSize)

{

if(pSize> m_capacity)

{

m_iteratorp= newT[pSize];

intlen= getSize();

for(inti=0;i<len;i++)

*p++= *m_begin++;

delete[]m_begin;

m_begin= p-(m_end-m_begin);

m_end= p;

m_capacity=pSize;

}

}

voidclear()

{

m_begin= m_end;

}

voidswap(m_iteratorx,m_iteratory)

{

Ttemp= *x;

*x= *y;

*y= temp;

}

voidswap(T&x,T&y)

{

Ttemp= y;

y= x;

x= temp;

}

voidsort()

{

intlen= getSize();

for(inti=0;i<len;i++)

for(intj=i;j<len;j++)

if(m_begin[i]> m_begin[j])

swap(m_begin[i],m_begin[j]);

}

voidearse(m_iteratorit)

{

if(it>= m_begin&& it< m_end);

throwout_of_range("删除越界!");

while(it!=m_end)

{

*it++= *(it+1);

}

--m_end;

}

};


int_tmain(intargc,_TCHAR*argv[])

{

vector<int>iVec;

iVec.push_back(2);

iVec.push_back(1);

iVec.push_back(6);

for(vector<int>::m_iteratorit= iVec.getBegin();it!= iVec.getEnd();it++)

{

cout<<*it<<" ";

}

cout<<endl;

intlen= iVec.getSize();

cout<<"Thelength is: "<<len<<endl;


iVec.sort(); //进行简单的冒泡排序

for(vector<int>::m_iteratorit= iVec.getBegin();it!= iVec.getEnd();it++)

//可以和普通指针一样++ 没有进行运算符的重载

{

cout<<*it<<" ";

}

getchar();

return0;

}



网络上实现的一个

#include<cassert>

template<class T>
class vector
{
private:
typedef T& reference;
typedef const T& const_ref;

public:
typedef T* iterator;
typedef const T* const_it;

enum{INITCAPACITY = 20};

vector()
{
m_capacity = INITCAPACITY;
m_pb = new T[m_capacity];
m_pe = m_pb;
}

vector(
size_ts)
{
m_capacity = s>INITCAPACITY ?s:INITCAPACITY;
m_pb = new T[m_capacity];
m_pe= m_pb;
}

~vector()
{
if (m_pb)
{
delete[] m_pb;
m_pb = 0;
}

m_pe = 0;
m_capacity = 0;

}

inline const_ref operator[] (
size_tt) const
{
assert( t < (
size_t)(m_pe- m_pb));
return m_pb[t];
}

inlineiterator begin()
{
return m_pb;
}

inline iterator end()
{
return m_pe;
}

inline const_it begin()const
{
return m_pb;
}

inline const_it end() const
{
return m_pe;
}

inline size_t size() const
{
return m_pe-m_pb;
}

inline size_t capacity()const
{
returnm_capacity;
}

inline bool empty() const
{
return m_pe == m_pb;
}

inlineconst_ref back() const
{
return *(m_pe-1);
}

void push_back(T t)
{
if ((size_t)(m_pe-m_pb+1) > m_capacity )
{
reserve(m_capacity<<1);
}

*m_pe++ =t;
}

void pop_back()
{
if(m_pe >m_pb)
{
--m_pe;
}
}

void clear()
{
m_pe = m_pb;
}

///
//Desc:
倒置容器的元素
///
void reverse()
{
iterator b = m_pb;
iterator e = m_pe;

for ( ; --e > b ; ++b )
{
ite_swap(e,b);
}
}

///
//Desc:
倒置be区间的元素
///
static void reverse( iterator b, iterator e )
{
for ( ; --e > b ; ++b )
{
ite_swap(e,b);
}
}

///
//Desc:
重新分配容器的容量
///
void reserve(size_t s)
{
if (s > m_capacity)
{
iterator p = new T[s];

for (iterator it = m_pb; it!= m_pe;)
{
*p++ = *it++;
}

delete[]m_pb;

//*****
这里需要保证m_pb释放后仍然指向原来的地址*****//
m_pb = p-(m_pe-m_pb);
m_pe = p;
m_capacity =s;
}
}

///
//Desc:
删除容器内be区间的所有元素,
///
void erase(iterator b, iterator e )
{
assert(b>= m_pb && b < m_pe);
assert(e > m_pb&& e <= m_pe);

while( e != m_pe)
{
*b++ = *e++;
}

m_pe -=(e-b);
}

///
//Desc:
删除容器内的一个元素,
///
void erase(iterator it)
{
assert(it >=m_pb && it < m_pe);

while( it !=m_pe )
{
*it++ = *(it+1);
}

--m_pe;

}

///
//Desc:
be区间的元素复制到容器尾部
///
void copyback(const_it b, const_it e )
{
assert( b < e );

for( ; b != e; ++b )
{
if ( (size_t)(m_pe-m_pb+1) > m_capacity )
{
reserve(m_capacity<<1);
}

*m_pe++ = *b;
}
}

///
//Desc:
be区间符合条件的元素复制到容器尾部
///
void copyback(const_it b, const_it e, bool(*f)(const_ref))
{
assert( b < e );

for ( ; b != e; ++b)
{
if ( f(*b))
{
if ((size_t)(m_pe-m_pb+1) > m_capacity )
{
reserve(m_capacity<<1);
}

*m_pe++ = *b;
}
}
}

iterator find_if( bool(*f)(const_ref) )
{
iterator it;

for ( it = m_pb; it !=m_pe; ++it)
{
if ( f(*it) )
{
break;
}
}

return it;
}

///
//Desc:
在容器内查找第一个元素,如果找到返回指针,否则返回超尾
///
iterator find( const_ref t, bool(*f)(const_ref, const_ref) )
{
iterator it;

for ( it = m_pb; it !=m_pe; ++it)
{
if ( f(*it,t) )
{
break;
}
}

return it;
}

///
//Desc:
be区间查找第一个元素,如果找到返回指针,否则返回超尾
///
static iterator find_if( iterator b, iterator e,bool(*f)(const_ref) )
{
assert( b < e );

iterator it;

for ( it = b; it != e; ++it)
{
if ( f(*it) )
{
break;
}
}

return it;
}

///
//Desc:
查找与最后一个元素,如果找到返回指针,否则返回超尾
///
iterator find_end( const_ref val, bool(*f)(const_ref, const_ref))
{
for (iterator it = m_pe-1; it != m_pb-1; --it)
{
if ( f(*it , val) )
{
return it;
}
}

return m_pe;
}

iterator find_end( bool(*f)(const_ref) )
{
for (iterator it = m_pe-1;it != m_pb-1; --it)
{
if ( f(*it) )
{
return it;
}
}

return m_pe;
}

///
//Desc:
查找符合条件的元素数量
///
size_t count_if( bool(*f)(const_ref) )
{
size_t count =0;

for (iterator it = m_pb; it != m_pe;++it)
{
if ( f(*it))
{
++count;
}
}

return count;
}

///
//Desc:
查找符合条件的元素数量,可以比较相等或者不相等
///
size_t count_if( const_ref val, bool(*f)(const_ref, const_ref) )
{
size_t count =0;

for (iterator it =m_pb; it != m_pe; ++it)
{
if ( f(*it,val))
{
++count;
}
}

return count;
}

///
//Desc:
在容器内查找元素,将其删除,并移动超尾
///
void remove_if(bool(*f)(const_ref) )
{
for(iterator it = m_pb; it != m_pe; )
{
if (f(*it))
{
for (iterator it1 = it;it1!= m_pe; ++it1)
{
*it1=*(it1+1) ;
}

--m_pe;
}
else
{
++it;
}
}
}

static voidite_swap( iterator x, iterator y )
{
T t = *x;
*x = *y, *y = t;
}

///
//Desc:
依照条件排序b'e区间的元素
///
static void sort(iterator b, iterator e,bool(*f)(const_ref,const_ref))
{
assert( b <= e);

for ( ; b != e; ++b )
{
for (iterator it = b+1; it!= e; ++it)
{
if ( f(*it,*b) )
ite_swap(it, b);
}
}
}

///
//Desc:
依照条件排序b'e区间的元素
///
void sort( bool(*f)(const_ref,const_ref) )
{
iterator b = m_pb;

for ( ; b != m_pe; ++b )
{
for (iterator it = b+1; it!= m_pe; ++it)
{
if ( f(*it,*b) )
ite_swap(it, b);
}
}
}

template< class F >
static void for_each(iterator b,iterator e, F(*f)(reference))
{
assert( b <= e);

while( b != e)
{
f(*b++);
}
}

template< class F >
void for_each( F(*f)(reference) )
{
iterator b =m_pb;

while( b != m_pe)
{
f(*b++);
}
}

///
//Desc:
随机打乱b'e区间的元素
///
static void random_shuffle(iterator b, iterator e)
{
assert( b < e);

iterator it = b;

for (size_t u = 1; ++it != e; ++u)
{
size_t m = 0x7FFF;
size_t n = rand() & 0x7FFF;

for (; m < u && m != ~0L; m = (m<<0xF) |0x7FFF )
{
n = (n<<0xF) |0x7FFF;
}

ite_swap( it, b+(n%u) );
}
}

private:
iterator m_pb;
iterator m_pe;
size_t m_capacity;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值