第七十一讲 细说list(3)

和vector一样,list同样拥有从后面插入元素的能力,而且方法也一样,当然这样做的原因主要是为了通用性,也就说不管是vector还是list,我们都可以使用push_back来插入元素,但是和vector不同的地方是,list不但可以后插,还能够前插,这是通过一组函数实现的:

————————————–

template<typename T,typename A=allocator<T>>

class list{


//


//


reference front();

//取得第一个元素


const_reference front() connst;

void push_front(const T&

);

//在前端插入一个元素,让他成为第一个元素

void pop_front();

//删除第一个元素

void remove(const T&

val);

//删除等于val的元素


template<typename Pre>

void remove_if(Pre p);

//通过一个函数对象来删除元素

void unique();

//删除重复的元素,使用他有技巧


template<typename BinPred>

void unique(BinPred b);

void reverse();


//


//

};

————————————–

这些操作看上去都是这样的眼熟,以至于我们使用起的时候就不会觉得陌生了(这不是废话吗?),但是通常情况下,我们的建议当然是选择后插的方式,因为这样几乎可以将list和vector互换。

上一讲我们知道,vector的插入效率非常高(splice和merge等等都可见一斑)。

下面举个简单的例子来说一下这几个函数的用法:

————————————

class equ{

public:

equ(int
n = 0) :m_n(n){ }

bool operator()(int n){


return m_n == n;

}

private:

int m_n;

};


template<typename T>


void show(list<T>&

ml){

list<T>::iterator it = ml.begin();

while (it != ml.end())

cout <<*it++ <<"

"

;

cout <<endl;

}

int main(){

int a[] ={ 2, 3, 6, 1, 4, 3, 6, 6, 4, 3, 2, 7, 9, 2
};

list<int>mlist1(a, a + 14);

mlist1.remove(3);

show(mlist1);

mlist1.remove_if(equ(6));

show(mlist1);

mlist1.unique();

show(mlist1);

mlist1.sort();

mlist1.unique();

show(mlist1);

mlist1.push_front(0);

show(mlist1);

mlist1.pop_front();

mlist1.pop_front();

show(mlist1);


return 0;

}

———————————

第七十一讲 细说list(3)

至此,关于list我们也没啥好说的了,如果觉得还不够清楚的,去结合vector那几讲看吧,因为支持vector的操作都至此list,除了我们说的下标[]和at(),其他的都几乎一样。

关于C++剩下的内容已经不多了(因为觉得没啥还值得好说的),大家想一下,接下来更想知道些什么?关于C++的扩展,比如MFC,比如COM,比如D3D等,什么都懂一些,但什么都谈不上精通,当然,如果大家感兴趣,我会把我所知道的一些拿出来和大家分享。

=============================

回复D直接查看目录

原文始发于微信公众号(

C/C++的编程教室

):第七十一讲 细说list(3)

|

发表评论