zoukankan      html  css  js  c++  java
  • STL简介

    1、简介

    (1)STL 是 C++ 标准程序库的核心。STL 内所有组件都由模板构成,其元素可以是任意类别。

    (2)STL译为标准模板库。STL从根本上讲是“容器”的集合,也是组件的集合。

    容器包括:list、vector、set、map等,组件包括迭代器、算法等。

    (3)STL的算法是标准算法,可以把STL已经定义的算法应用在容器的对象上。

    2、组成构件

    STL 的组件中最主要的是容器、迭代器、算法和仿函数。

    (1)容器:用来管理某类对象的集合

    (2)迭代器:用来在一个对象群集的元素上进行遍历动作

    (3)算法:用来处理群集内的元素

    3、基本结构

    STL 是 C++ 通用库,由容器、算法、迭代器、仿函数和内存配置器组成。

    (1)容器

    Vector<T>,是一种向量

    List<T>,是一种双向链表容器

    Queue<T>,是一种队列容器

    Stack<T>,是一种栈容器

    Deque<T>,是双端队列容器

    Set<T>,是一种集合容器

    Map<key,val>,是一种关联数组容器

    (2)算法

    STL提供了非常多的数据结构算法。

    这些算法在命名空间std的范围内定义,通过包含头文件<algorithm>来获得使用权。

    STL中所有的算法都是基于模板实现的。

    (3)迭代器

    通俗的讲,迭代器就是指示器,能够使程序反复对数据进行访问,为访问数据提供了通用的接口,类似于C++的指针。包括:

    a、输入迭代器:为程序需要的数据源提供接口,只能从一个序列读取数值,可修改可引用

    b、输出迭代器:只能向一个序列写入数据,可修改,可引用

    c、双向迭代器:可读可写,可进行前项、后项操作

    d、随机接入迭代器:可通过跳跃的方式访问任意数据,是功能最强大的迭代器

    (4)仿函数

    STL包含了大量仿函数。仿函数可以理解为函数的一般形式。仿函数有几种不同的约束,对于编程来说,仿函数非常重要。

    在标准C++规范中,函数调用一般使用指针,当需要调用函数时,只需要告诉函数的地址即可。

    (5)内存配置器

    STL包括了底层的内存分配和释放。

    STL提供3种容器配接器

    a、Statck<Container>
    
    b、Queue<Container>
    
    c、Deque<Container>

    示例代码:

    #这里以stack为例,运行环境:CFree(比VS轻量,运行速度快,学习算法推荐使用这个工具)
    #include <iostream>
    #include <stack> 
    using namespace std;
    
    int main(){
    	//定义堆栈对象
    	 stack<int> st;
    	 for(int i=0;i<10;i++){
    	 	//将数据压入堆栈 
    	 	st.push(i);	
    	 }
    	 while(!st.empty()){
    	 	//如果st非空即可持续访问其中的数据
    		//弹出堆栈第一个元素并输出
    		cout<<st.top()<<" ";
    		//弹出堆栈元素
    		st.pop(); 	 
    	 }
    	 cout<<endl;
    	 //任意键退出
    	 cin.get(); 
    }

    运行结果:

    4、特点

    优点:

    (1)代码易读性强;

    (2)STL集成了优秀的算法,熟悉使用可以提高开发效率;精通STL后,可以自己用模板去设计实现自己的算法和数据结构。

    缺点:

    (1)STL和其他的类库的接口不太方便;

    例如在VCL和MFC中,都有自己的string类型,CString和AnsiString,其余接口如果使用字符串,肯定是使用自己的原生类型,然而为了设计可移植的程序,有可能将平台独立的部分用STL实现,这样导致了在两部分合作时存在大量的转型动作,而且必须付出额外的转型动作,例如std::string和CString/AnsiString没有直接的转型方法,因此必须通过char *作为转型的媒介。

    (2)STL没有提供object persistent.(?)

    查语法错误不方便,由于广泛使用模板,编译器的提示信息总是千奇百怪,让人摸不找头脑。调试极不方便,Watch窗口的监视功能等于虚设.还要自己编写代码来查看容器内容.尤其是跟踪到STL内部之后,更让人晕头转向。

    5、编程概述

    #以矢量Vector为例
    #include <iostream>
    #include <vector> 
    using namespace std;
    //使用命名空间std
    
    //定义矢量对象
    vector<int> ratings(5);
    int n; 
    
    int main(){
    	//输入矢量的大小
    	cin>>n;
    	//定义矢量动态内存
    	vector<double>scores(n); 
    }
    
    #include <iostream>
    #include <vector> 
    #include <string>
    using namespace std;
    //使用命名空间std
    const int NUM=5;
    
    //定义矢量对象
    /*
    vector<int> ratings(5);
    int n; */
    
    int main(){
    /*
    	//输入矢量的大小
    	cin>>n;
    	//定义矢量动态内存
    	vector<double>scores(n); */
    	//定义矢量对象
    	vector<string> names(NUM); 
    	vector<int> sexs(NUM);
    	
    	cout<<"Please do exactly as told.you will enter
    "<<NUM<<"Personal name ,Their sex.
    ";
    	
    	int i=0;
    	//输入信息
    	for(i-0;i<NUM;i++){
    		cout<<"enter title #"<<i+1<<":";
    		//获取输入信息
    		getline(cin,names[i]);
    		cout<<"enter sex(0/1) #";
    		cin>>sexs[i];
    		//等待 
    		cin.get(); 
    	}
    	cout<<"you enterd the following:
    "<<endl;
    	//输出信息
    	for(i=0;i<NUM;i++){
    		cout<<names[i]<<"	"<<sexs[i]<<endl;
    	}
    	return 0;
    }
    #注意:这里总结出STL编程基本思路:定义变量--输入值--读取值

    运行结果:

  • 相关阅读:
    BZOJ2286 [Sdoi2011]消耗战 【虚树 + 树形Dp】
    BZOJ1305 [CQOI2009]dance跳舞 【网络流】
    BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】
    BZOJ1103 [POI2007]大都市meg 【树剖】
    BZOJ1927 [Sdoi2010]星际竞速 【费用流】
    POJ3450 Corporate Identity 【后缀数组】
    POJ3623 Best Cow Line, Gold 【后缀数组】
    POJ3415 Common Substrings 【后缀数组 + 单调栈】
    关于线上bug
    关于线上bug
  • 原文地址:https://www.cnblogs.com/yedushusheng/p/5520008.html
Copyright © 2011-2022 走看看