当前位置:C++技术网 > 资讯 > 学习心得之九-STL小记

学习心得之九-STL小记

更新时间:2015-09-21 19:53:52浏览次数:1+次

    除了顺序容器外,STL的容器配接器还定义了三个顺序容器适配器:stack,queue,priority_queue。适配器是标准库中的一个通用概念,容器,迭代器,函数都有适配器。一个适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。



stack<string,vector<string> >str_sre;//在vector上实现空栈;。

stack<string,vector<string> >(我觉得这里两个<,<最好中间放个空格,要不然有点像位运算里的左移运算符)str_sre2(sdc);//str_sre2在vector上实现,初始化时保存了sdc的拷贝;


默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的。我们可以在创建一个适配器时将一个命名的顺序容器作为第二个类型参数。

但是我们得注意,对于一个给定的容器适配器,我们要注意其是用哪些容器是有限制的。这是因为适配器自身所支持的操作限制。比如,所有的适配器要求容器具有添加和删除元素的功能,因此,我们的适配器不能基于array上构造。

stack只要求pop_back,push_back,back操作,我们可以使用除了array和forward_list以外的操作,而上例的vector容器有这些操作,而且还不止,我们就可以基于它来构造,但queue就不同了,他不能基于vcetor,因为,vector的能力不包括queue所支持的操作,因此queue不能基于vector构造。但是,我们能基于vcetor构造的就用它,别用别的,vector相当于可变数组大小,支持快速随机访问。除非有很好的理由,选择其他容器,否则别换它。

关联容器中的元素是按关键字来保存和访问的,顺序容器则是按他们在容器中的位置保存和访问的。

    set  multiset:
    会根据特定的排序准则,自动将元素排序。两者不同之处在于:multisets允许元素重复而set不允许。使用他两需要包含相同的头文件<set>,我们看看这个头文件的源代码:


namespace std{
	template <class T;
		  class Compare = less<T>;
		  class Allocator = allocator<T> >
	class set;

	template <class T;
		  class Compare = less<T>;
		  class Allocator = allocator<T> >
	class multiset;
}


第一个参数我们设为了任意型别的T,我们这里是类模板,在最后的时候我们告诉了编译器class set。就是说我们这里是型别是set。第二个参数就是默认的排序准则,关联容器有自动排序的功能,就是在这里实现的。第三个就是我们的内存模型allocator。这些都是在我们的命名空间std内定义的。

set一般只传入一个参数,就是关键字,但是如果我们需要修改排序准则,就可以加上第二个参数:


std::set<int, std::greater<int> >shunxu;


第二个参数我们从标准库std调用greater函数实现降幂。

在set与multiset的迭代器有很多的操作函数我就不一一列举了。我们看看插入函数:

我们先看下什么是接口:


我就不用再解释了吧,一目了然。


set提供如下的接口:


pair<iterator ,bool> insert(const value_type& charuyuansu);
iterator 	     insert(iterator charuweizhi,const value_type& charuyuansu);

multiset提供如下的接口:
iterator	     insert(const value_type& charuyuansu);
iterator 	     insert(iterator charuweizhi,const value_type& charuyuansu);


两个接口函数的返回值不同是因为multiset允许元素重复,而set不允许,如果我们调用set的insert接口,返回失败了,表明,这个元素早就存在了。pair的第二个参数是提示我们是否插入成功,返回值是bool类型,我们看看pair结构,一个pair保存两个数据成员函数:

pair<string,string> auther{"csdcsd",fdvfd"};同时我们也可以等价代换make_pair("csdcsd",fdvfd");

这条语句创建一个名为auther的pair,两个成员被初始化为“csdcsd","fdvfd";

auther.first是返回auther的名为first的公有数据成员;auther.second是auther的名为first的公有数据成员。

我们看看插入函数的实现:



...
std::set<double> c;
...
if(c.insert(3.3).second){
std::out<<"3.3inserted"<<std::endl;
}
else{
std::out<<"3.3alreade exists"<<std::endl;
}