第七十讲 细说list(2)

我们学习STL不仅因为他是C++的一部分,就凭他那优美的设计方案也是值得我们去探索的,虽然在大型项目中STL内的东西可能没有多少能够排上用场的,当然vector,list或者是string得除外,所以不管是出于什么原因,我们还是得继续探索STL里面的东西,vector是最基本的,也可以说是最为实用的,所以我们在说vector的时候花费了不少的篇章,当然,那是为了我们现在说其他的不用花太多的篇幅。

在构造函数方面和大多数的操作方面,list和vector几乎如出一辙,当然不只是list和vector像,可以说在STL里面大部分容器都有很多相似之处,那么大家可能会问,既然有vector,为什么还要有list呢?还记得我们在说vector的时候说过,vector也有表操作,他也有插入和删除,但我们也说过,那不是我们应该要有的选择,因为我们可以有更好的选择,那就是list,list虽然很多操作和vector一样,但是也有vector没有的,比如说,list不知道下表[],也同样不支持at(),但是list有自己的特殊操作:

———————————-

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

class list{


//


//

void splice(iterator pos,list&

l);

void splice(iterator pos,list&

l,iterator p);

void splice(iterator pos,list&

l,iterator first,iterator last);

void merge(list&

l);


template<typename Cmp>

void merge(list&

l,Cmp cmp);

void sort();


template<typename Cmp>

void sort(Cmp cmp);


//


//

};

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

splice函数通常只做移动不复制,简单点说,如果我们有两个list:

————————————-

class equ{

public:

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

bool operator()(int n){


return m_n == n;

}

private:

int m_n;

};


int main(){

int a[] ={ 3, 2, 1, 5, 6, 8
};

int b[] ={ 2, 7, 9, 0, 3
};

list<int>m_list1(a, a + 6);

list<int>m_list2(b, b + 5);

list<int>::iterator it = find_if(m_list1.begin(), m_list1.end(), equ(5));

m_list1.splice(it, m_list2, m_list2.begin(), m_list2.end());

it = m_list1.begin();

while (it != m_list1.end())

cout <<*it++ <<"

"

;

cout <<endl;

list<int>::iterator it2 = m_list2.begin();

while (it2 != m_list2.end())

cout <<*it2++ <<"

"

;

int c[] ={ 11, 15, 16
};

list<int>m_list3(c, c + 3);

m_list1.splice(m_list1.end(), m_list3, m_list3.begin());

it = m_list1.begin();

cout <<endl;

while (it != m_list1.end())

cout <<*it++ <<"

"

;

list<int>::iterator it3 = m_list3.begin();

cout <<endl;

while (it3 != m_list3.end())

cout <<*it3++ <<"

"

;

m_list1.splice(it, m_list3);

it = m_list1.begin();

cout <<endl;

while (it != m_list1.end())

cout <<*it++ <<"

"

;


return 0;

}

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

这只是一个简单的例子,但他可以完美体现出了splice的用法,从他的结果我们看的出来,splice有切割连接之意:

第七十讲 细说list(2)

如果还是不明白,可以把这些代码敲进自己的电脑,一步步的追踪查看会得到想要的结果,那么我们来看看merger和sort,不过关于sort,我们这里就不说了,如果对sort还是不熟的话,可以回头去看看我们的排序算法那一章,现在我们来说说merge,还是直接从实例入手吧,因为我觉得这才是最好的教学方法:

———————————

int d[] ={ 2, 3, 8, 4
};

list<int>m_list4(d, d + 4);

m_list1.sort();

m_list4.sort();

m_list1.merge(m_list4);

it = m_list1.begin();

cout<<endl;

while (it != m_list1.end())

cout <<*it++ <<"

"

;

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

通过merge后,m_list1的内容明显是原来m_list1和m_list4的和,而且是排好序的,当然,我们可以不先使用sort,但是那样的话就不保证排序了,而且可能还会有些小小的麻烦,但是不影响,如果你们好奇想要知道是什么麻烦,不妨自己尝试一下吧。

好了,今天的内容就这些吧,明天我们来结束list吧,由于我们已经掌握了vector,所以对于list也没有其他可以说的了,当然不只是list,后面我们所要接触的容器也都和vector差不多,如果对vector不熟悉的还是赶快回去看看吧,我们关于vector那几讲几乎是囊括了STL里大部分容器的操作方式。

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

回复D直接查看目录

原文始发于微信公众号(

C/C++的编程教室

):第七十讲 细说list(2)

|

发表评论