第23课 - STL简介

第23课 - STL简介

    一.什么是STL(标准模板库)?

        1.1 STL,即Standard Template Library,是C++的一部分

        1.2 STL是常用数据结构和算法的集合

        1.3 STL的目标是标准化组件,提高开发效率和程序可靠性

    

    二.STL库作为C++的一部分与编译器一同被发布

        2.1 STL主要由以下三个部分组成

            -容器:管理数据的集合(链表,队列,栈)

            -算法:处理集合内的元素

            -迭代器:遍历集合内的元素

        

        2.2 STL中的容器(链表,栈,队列,哈希表)

            2.2.1 容器中存放的都必须是值,而不能是引用

            2.2.2 容器内部实施的是值拷贝操作

            2.2.3 容器中可以存放指针作为数据元素

            
          
         a.线性表的典型操作:
                -size:         获取当前容器中的元素数目
                -insert:    在当前元素面前插入新元素
                -erase:    删除当前元素
                -empty:    判断当前容器是否为空
                -front:    获取第一个元素
                -back:        获取最后一个元素
        
            Source Example 2.2.1(vector,数组类的使用):
                #include <iostream>
                #include <vector>

                /* run this program using the console pauser or add your own getch, system("pause") or input loop */
                using namespace std;

                int main(int argc, char** argv) {
                    
                    /* 本质就是一个数组类 */
                    vector<int> vi(10);
                        
                    for (int i = 0; i < 5; i++)
                    {
                        vi[i] = i + 1;
                    }
                    
                    /* 动态将数组类大小进行伸缩,新元素的初始值为0 */
                    vi.resize(5);
                    
                    for (int i = 0; i < vi.size(); i++)
                    {
                        cout<<vi[i]<<endl;
                    }
                    
                    vector<int> vin;
                    
                    /* 两个数组可以相互赋值 */
                    vin = vi;
                    
                    vi.resize(0);
                    
                    for (int i = 0; i < vin.size(); i++)
                    {
                        cout<<vin[i]<<endl;
                    }
                    
                    return 0;
                } 

            b.栈性质:后进先出(LIFO->Last In First Out)

         c.队列性质:先进先出(FIFO)

            
      
      栈和队列的典型操作:
                push:     无返回值,将元素压栈(队列)
                pop:    弹出栈(队列)第一个元素
                top:    返回栈第一个元素
                front:    返回队列第一个元素
                
            Source Example 2.2(stack和queue的使用):
                #include <iostream>
                #include <stack>
                #include <queue>

                /* run this program using the console pauser or add your own getch, system("pause") or input loop */
                using namespace std;

                void StackUsage()
                {
                    cout<<"Stack Usage:"<<endl;
                    
                    stack<double> s;
                    
                    for (int i = 0; i < 5; i++)
                    {
                        s.push(i / 100.0);
                    }
                    
                    cout<<"Elements in s:"<<endl;
                    while (!s.empty())
                    {
                        double v = s.top();
                        
                        s.pop();
                        
                        cout<<v<<endl;
                    }
                }

                void QueueUsage()
                {
                    cout<<endl<<"Queue Usage:"<<endl;
                    
                    queue<int> q;
                    
                    for (int i = 0; i < 5; i++)
                    {
                        q.push(i + 1);        
                    }
                    
                    cout<<"Elements in q:"<<endl;
                    while (!q.empty())
                    {
                        double v = q.front();
                        
                        q.pop();
                        
                        cout<<v<<endl;
                    }
                }

                int main(int argc, char** argv) {
                    
                    StackUsage();
                    QueueUsage();
                    
                    return 0;
                }           

            输出结果如下:


            

        2.3 STL中的迭代器

            2.3.1 STL中的迭代器是遍历容器的"标准"方式

                迭代器可以理解为一个指向元素的"指针"

                
      
  Source Example2.3(list和iterator的使用):
            #include <iostream>
            #include <list>

            /* run this program using the console pauser or add your own getch, system("pause") or input loop */
            using namespace std;

            void ListUsage()
            {
                cout<<"ListUsage:"<<endl;
                
                /* 双向链表 */
                list<double> l;
                
                for (int i = 0; i < 5; i++)
                {
                    l.push_back((i + 1) / 1000.0 );
                }
                
                cout<<"Element in l:"<<endl;
                
                /* 迭代器p其实就是一个指针 */
                list<double>::iterator p = l.begin();
                
                while (p != l.end())
                {
                    cout<<*p<<endl;
                    p++;    
                }
            }

            int main(int argc, char** argv) {
                
                ListUsage();
                    
                return 0;
            }
            

        输出结果如下:


        

        2.3 STL中提供了大多数常用的泛型算法

                (遍历,排序,反转,合并等等)

                算法头文件<algorithm>

                
         
   Source Example2.3 (STL中算法的使用):
                #include <iostream>
                #include <algorithm>
                #include <vector>

                /* run this program using the console pauser or add your own getch, system("pause") or input loop */
                using namespace std;

                void current(int& v)
                {
                    cout<<v<<endl;
                }

                void print(vector<int>& vec)
                {
                    cout<<"Elements in vector:"<<endl;
                    
                    /* 遍历算法,每次遍历执行current函数,将数值作为参数传递 */
                    for_each(vec.begin(), vec.end(), current);
                }

                int compare(const int &a, const int &b)
                {
                    return a > b;
                }

                int main(int argc, char** argv) {
                    
                    vector<int> v(10);
                    
                    for (int i = 0; i < 10; i++ )
                    {
                        v[i] = i;
                    }
                    
                    print(v);
                    
                    /* 排序算法,从v.begin到v.end进行由大到小排序 */
                    sort(v.begin(), v.end(), compare);
                    
                    print(v);  
                    
                    return 0;
                }        

    三.小结

        STL是C++标配的模板库,是工程经验的总结,也是开发效率和软件可靠性的保证。

               good book: C++ STL标准程序库开发指南

                                    Effective STL

                            
           

猜你喜欢

转载自blog.csdn.net/qq_36521904/article/details/80487858