和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我们也没啥好说的了,如果觉得还不够清楚的,去结合vector那几讲看吧,因为支持vector的操作都至此list,除了我们说的下标[]和at(),其他的都几乎一样。
关于C++剩下的内容已经不多了(因为觉得没啥还值得好说的),大家想一下,接下来更想知道些什么?关于C++的扩展,比如MFC,比如COM,比如D3D等,什么都懂一些,但什么都谈不上精通,当然,如果大家感兴趣,我会把我所知道的一些拿出来和大家分享。
=============================
回复D直接查看目录
原文始发于微信公众号(
C/C++的编程教室
):第七十一讲 细说list(3)
|