我们学习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有切割连接之意:
如果还是不明白,可以把这些代码敲进自己的电脑,一步步的追踪查看会得到想要的结果,那么我们来看看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)
|