STL教程:C++ STL快速入门

2023-05-16

目录

1.STL引言

2.STL是什么(STL简介)

3.STL历史

4.STL组件

5.STL基本结构

6.STL 使用方法

7.STL目录

网址:STL教程:C++ STL快速入门(非常详细)

第1章 string类

第2章 序列容器

第3章 容器适配器

第4章 map容器

第5章 set容器

第6章 C++常用算法

第7章 随机数

第8章 流迭代器

第9章 使用数值、时间和复数







1.STL引言

STL 是“Standard Template Library”的缩写,中文译为“标准模板库”STL C++ 标准库的一部分,不用单独安装。

C++模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组)list 的底层为双向链表deque 的底层为循环队列set 的底层为红黑树hash_set 的底层为哈希表

更多关于 STL 的介绍请猛击:STL是什么

这套 C++ STL 入门教程非常详细,旨在让您快速学会标准模板库的使用。读者需要具备 C++ 基础,并了解C++模板的用法。

2.STL是什么(STL简介)

本节主要讲述 STL 历史STL 组件STL 基本结构以及 STL 编程概述

STL历史可以追溯到 1972 年 C 语言在 UNIX 计算机上的首次使用。直到 1994 年,STL 才被正式纳入 C++ 标准中。

STL 组件主要包括容器,迭代器、算法和仿函数。STL 基本结构和 STL 组件对应。

STL主要由迭代器算法容器仿函数内存配置器配接器六部分组成,可帮助程序员完成许多功能完善、形式多样的程序。

3.STL历史

C 语言是 1972 年由美国的 Dennis Ritchie 设计发明的,并首次在 UNIX 操作系统的计算机上使用。C 语言由早期的汇编语言 BCPL 发展演变而来。随着微型计算机的日益普及,C 语言出现了许多其他版本,由于没有统一的标准,各版本之间出现了不一致之处。ANSI 因此为 C 语言制定一套 ANSI 标准,后来成为现行的 C 语言标准。

早期的 C 语言主要用于 UNIX 系统。因其强大的功能和各方面的优点逐渐被人们认识。20 世纪 80 年代,C 语言开始应用于其他操作系统,并很快在各种计算机上得到广泛应用,成为当代最优秀的程序设计语言之一。

C 语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构,还可以直接访问内存物理地址,甚至进行位操作。此外,C 语言还可实现对硬件的编程操作,十分便捷方便

1983 年,贝尔实验室的 BjameStrou-strup 推出了 C++。C++ 进一步扩充和完善了 C 语言,成为面向对象的程序设计语言。最初 C++ 主要用于小型计算机系统。1988 年,出现了第一个用于 PC 的 Z0RTECH C++ 2.0 编译系统1989 年,出现了 Turbo C++2.0 编译器

1991 年开始,Borland 公司陆续推出了 Borland C++ 2.0/3.0/4.0 系统。而微软公司直到 1992 年,才推出基于 DOS 的 MS C/C++ 7.0 系统。

1993 年,微软推出了面向 Windows 的 Visual C++ 1. 0 系统,并于 1998 年推出 了 Visual C++6. 0

C 语言提供了具有可适应性的、强大的抽象机制,用于对问题进行抽象。这种语言结构允许程序员创建和使用新的类型,而这些新的类型则可以与实际应用中所包含的概念相适应。在 C++ 的最新发展过程中,C++ 新增了模板新特性。通过使用模板,程序具备更好的代码重用性能。

1994 年 7 月,美国国家标准与技术研究院通过投票决定,将 STL 纳入 C++ 标准,使之成为 C++ 库的重要组成部分。1997 年,C++ 标准完成了最近一次的修改,官方名称为 ISO/IEC 14882。

STL 从根本上讲是“容器”的集合,也是组件的集合。容器包括 list、vector、set、map 等;组件包括迭代器等。STL 的目的是标准化组件,与 Visual C++ 中的 ATL 相似。

STL 是 C++ 的一部分,不用额外安装,被内建在支持 C++ 的编译器中。

STL 的算法是标准算法,其实现了将已经定义好的算法应用在容器的对象上。

4.STL组件

STL C++ 标准程序库核心。STL 内的所有组件都由模板构成,其元素可以是任意型别。程序员通过选用恰当的群集类别调用其成员函数和算法中的数据即可,但代价是 STL 晦涩难懂。

STL 组件主要包括容器,迭代器、算法和仿函数

容器

容器即用来存储并管理某类对象的集合。例如鱼缸是用来盛放金鱼的容器。

每一种容器都有其优点和缺点。为满足程序的各种需求,STL 准备了多种容器类型,容器可以是 arrays 或是 linked lists,或者每个元素有特别的键值。

迭代器

迭代器用于在一个对象群集的元素上进行遍历动作。对象群集可能是容器,也可能是容器的一部分。

迭代器的主要用途是为容器提供一组很小的公共接口。利用这个接口,某项操作可以行进至群集内的下一个元素。

每种容器都提供了各自的迭代器。迭代器了解该容器的内部结构,所以能够正确行进。迭代器的接口和一般指针类似

算法

算法用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。

STL 的一个特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。

STL 的另一个特性即组件可以针对任意型别运作。“标准模板库”这一名称即表示“可接受任意型别”的模板,并且这些型别均可执行必要操作。

在 STL 中,容器又分为序列式容器和关联式容器两大类,而迭代器的功能主要是遍历容器内全部或部分元素的对象。迭代器可划分为 5 种类属,这 5 种类属归属两种类型:双向迭代器和随机存取迭代器。

SIL 中提供的算法包括搜寻、排序、复制、重新排序、修改、数值运算等。

仿函数

STL中大量运用了仿函数。仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。

5.STL基本结构

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

容器

STL 包含诸多容器类。容器类是可以包含其他对象的类,就像数组和队列堆栈等数据结构包含整数、小数、类等数据成员一样。STL 可以包含常见的向量类、链表类、双向队列类、集合类、图类等,每个类都是一种模板,这些模板可以包含各种类型的对象。

下述代码是常用的 vector 赋值方法:

vector <int> l;
for (int i =0;i <100;i++ )
    l.push_back (i);

下述代码采用 map 容器进行二维元素的管理:

map <string, string, less <string>> cap; //按从小到大序
cap ["Ark"] ="Little Rock";
cap ["New"] ="Albany";

map 类似于二维数组,但比二维数组灵活得多。

目前,STL 中已经提供的容器主要如下:

  • vector <T>:一种向量。
  • list <T>:一个双向链表容器,完成了标准 C++ 数据结构中链表的所有功能。
  • queue <T>:一种队列容器,完成了标准 C++ 数据结构中队列的所有功能。
  • stack <T>:一种栈容器,完成了标准 C++ 数据结构中栈的所有功能。
  • deque <T>:双端队列容器,完成了标准 C++ 数据结构中栈的所有功能。
  • priority_queue <T>:一种按值排序的队列容器。
  • set <T>:一种集合容器。
  • multiset <T>:一种允许出现重复元素的集合容器。
  • map <key, val>:一种关联数组容器。
  • multimap <key, val>:一种允许出现重复 key 值的关联数组容器。


以上容器设计高效,还提供了接口。程序员可以在任何适当的地方使用它们。

容器可以分为序列式容器关联式容器两大类。序列式容器主要有 vector、list 和 deque;关联式容器包括 set、map、multiset 和 multimap 等容器模板类。

算法

STL 提供了非常多的数据结构算法。这些算法在命名空间 std 的范围内定义,通过包含头文件 <algorithm> 来获得使用权。

常见的部分算法如下:

  • for_each();
  • find();
  • find_if();
  • count();
  • count_if();
  • replace();
  • replace_if();
  • copy();
  • unique_copy();
  • sort();
  • equal_range();
  • merge();


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

迭代器

通俗来讲,迭代器就是指示器。迭代器技术能够使程序非常快捷地实现对 STL 容器中内容的反复访问。反复访问意味着一次可以访问一个或多个元素。

迭代器为访问容器提供了通用的方法,类似于 C++ 的指针。当参数化类型是 C++ 内部类型时,迭代器即 C++ 指针

STL 定义了 5 种类型的指示器,并根据其使用方法予以命名。每种容器都支持某种类别的迭代器。常见的迭代器包括输入、输出、前向、双向和随机接入等类别:

  • 输入迭代器主要用于为程序中需要的数据源提供输入接口,此处的数据源一般指容器、数据流等。输入迭代器只能从一个序列中读取数值。该迭代器可以被修改和被引用。
  • 输出迭代器主要用于输出程序中已经得到的数据结果(容器,数据流)。输出迭代器只能向一个序列写入数据。该迭代器也可以被修改和被引用。
  • 双向迭代器既可以用来读又可以用来写,它与前向迭代器相类似。双向迭代器可以同时进行前向和后向元素操作。所有 STL 容器都提供了双向迭代器功能,这既有利于数据的写入和读出,又有利于提供更加灵活的数据操作。
  • 有的容器甚至提供了随机接入迭代器。随机接人迭代器可以通过跳跃的方式访问容器中的任意数据,使数据的访问非常灵活。随机访问迭代器具有双向迭代器的所有功能,是功能最强大的迭代器类型。


迭代器的诞生使算法和容器分离成为可能。算法是模板,其类型依赖于迭代器,不会局限于单一容器。不同的 STL 算法需要不同类型的迭代器来实现相应的功能。因为不同类型的 STL 容器支持不同类型的迭代器,所以不能对所有容器使用相同的算法。

仿函数

STL 包含了大量仿函数。仿函数可以理解为函数的一般形式。对于编程来说,仿函数非常重要,并有几种约束。在 C++ 标准中,函数调用一般使用指针,当需要调用函数时,只需要提供函数的地址即可。例如:

static int cmp (int* i, int* j)
{
    return (*i - *j);
}

上述代码定义了一个 cmp() 函数,当需要调用此函数时,只需提供函数的地址即可。例如:

qsort(a,10,sizeof(int), cmp);

此方法的最大缺陷是效率低。为提高效率,STL 定义了仿函数这种概念。下述代码定义了一个仿函数,其特征是使用 operator 实现定义。

struct three_mul
{
    bool operator() (int& v)
    {
        return (v%3 ==0)
    }
}

通过运算符定义显著提高效率。例如,

for_each (myvector.begin (), myvector.end(), three_mul);

内存配置器和配接器

STL 包括底层的内存分配和释放。内存配置器非常少见,在此可以忽略,在后面章节专门介绍。

配接器可以实现不同类之间的数据转换。最常用的配接器有 istream_temtor,它提供了函数复制的接口。配接器对于 STL 技术来说非常重要。

STL 提供了 3 种容器配接器,分别是:

stack <Container>;
queue <Container>;
deque <Container>;

看这样一个程序:

#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())
    {
        cout << st.top() << " "; //弹出堆找的第一个元素,并输出
        st.pop(); //弹出堆栈元素
    }
    cout<< endl;
    cin.get();    //任意键退出
    return 0;
}

程序执行结果为:

9 8 7 6 5 4 3 2 1 0

6.STL 使用方法

STL 作为 C++ 通用库,主要由迭代器、算法、容器、仿函数、内存配置器和配接器六大部分组成。程序员使用 STL 容器能够实现多种标准类型且操作便捷的容器。

对于编程人员,标准化组件意味着直接使用现成的组件,不用重复开发。使用 STL 最重要的是掌握基本理论和编程方法,了解 STL 编程技术,必须深刻掌握 STL 容器技术和 STL 迭代器技术。

STL 提供了一组表示容器、迭代器、仿函数和算法的模板:

  • 容器是类似数组的单元,可存储 若干个值,且STL容器是同质的,即存储的值类型相同;
  • 算法是完成特定任务的处方;
  • 迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;
  • 仿函数是类似于函数的对象,可以是类对象或函数指针。


STL 使程序员能够构造各种容器和执行各种操作。

下面以矢量为例,简要讲述矢量模板的使用。

在数学计算和 STL 模板中,vector 对应数组,提供与 valarray 和 ArrayTP 类似的操作。而 STL 为使 vector 矢量具备通用性,在头文件 <vector> 中定义了 vector 模板。具体方法为:创建 vector 模板对象,使用通常的 <type> 表示法指出要使用的类型;然后使用初始化参数决定矢量的大小,并定义矢量动态内存。例如:

#include <vector>
using namespace std;    //使用命名空间 std
vector <int> ratings (5);    //定义矢量对象 int n;
cin >> n;    //输入矢量大小
vector <double> scores (n);    //定义矢量动态内存

内存分配器是用来管理对象内存的。在 STL 容器模板中,一般都有一个可选的模板参数。例如:

template <class T, class Allocator = allocator <T>>//矢量模板
class vector {
    ...
}

若省略该模板参数的值,则容器模板将默认使用 allocator<T> 类。类 allocator 以标准形式使用 new 和 delete 内存管理方式。

下面举例说明,创建两个 vector 对象:一个是 int 规范;另一个是 string 规范:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int NUM = 5;
int main ()
{
    vector <string>names(NUM);    //定义矢量对象
    vector <int> sexs (NUM);    //同上
    cout<<"Please Do Exactly As Told You Will enter \n"<<NUM<<" Personal Name and Their Sex.\n";
    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 << "Thank you. You entered the following:    \n"<< "name/sex" << endl;
    for (i = 0; i <NUM; i++ )    //输出信息
    {
        cout <<names[i] << "\t" << sexs[i] << endl;
    }
    return 0;
}

程序执行结果为:

Please Do Exactly As Told You Will enter
5 Personal Name and Their Sex.
Enter title # 1: A
Enter sex (0/1) #1
Enter title # 2: B
Enter sex (0/1) #1
Enter title # 3: D
Enter sex (0/1) #0
Enter title # 4: E
Enter sex (0/1) #1
Enter title # 5: E
Enter sex (0/1) #1
Thank you. You entered the following:
name/sex
A       1
B       1
D       0
E       1
E       1

7.STL目录

网址:STL教程:C++ STL快速入门(非常详细)

第1章 string类

1.C++ string

2.auto_ptr智能指针

3.basic_string

4.string成员函数

5.string构造函数和析构函数

6.C++获取字符串长度

7.C++获取字符串元素

8.C++字符串比较

9.C++字符串修改和替换

10.C++字符串输入输出

11.C++字符串查找

12.C++ string支持迭代器

13.C++ string支持配置器

第2章 序列容器

1.序列式容器

2.C++ array

3.array元素的获取

4.array迭代器

5.array元素的比较

6.C++ vector

7.vector的容量和大小

8.vector获取(访问)元素

9.vector迭代器及用法

10.vector添加(增加)元素

11.vector插入元素

12.vector删除元素

13.deque的使用、创建及初始化

14.deque获取元素

15.deque添加和删除元素

16.deque修改元素

17.list的使用、创建和初始化

18.list增加和插入元素

19.list删除元素

20.list元素的排序和合并

21.list访问(获取)元素

22.forward_list用法

23.自定义迭代器

第3章 容器适配器

1.C++ stack

2.C++ queue

3.C++ priority_queue

4.C++堆

5.C++序列容器存储智能指针

6.优先级队列存储智能指针

第4章 map容器

1.C++ map

2.C++ map的创建

3.C++ map插入数据

4.C++ map构造元素

5.C++ map获取元素

6.C++ map删除元素

7.C++ pair

8.C++ tuple

9.C++ multimap

10.C++ 自定义比较函数

11.C++ hash

12.C++ unordered_map

13.C++ unordered_map初始化

14.C++ unordered_map插入元素

15.C++ unordered_map获取元素

16.C++ unordered_map删除元素

17.C++ unordered_multimap

第5章 set容器

1.C++ set

2.C++ set初始化

3.C++ set添加、删除和访问元素

4.C++ set用法

5.C++ set迭代器

6.C++ set保存指针

7.C++ multiset

8.C++ unordered_set

9.C++ unordered_set插入元素

10.C++ unordered_set查找元素

11.C++ unordered_set删除元素

12.C++ set_union

13.C++ set_intersection

14.c++ set_difference

15.C++ includes

第6章 C++常用算法

1.C++ sort

2.C++ stable_sort

3.C++ partial_sort

4.C++ nth_element

5.C++ is_sorted

6.C++ merge和inplace_merge

7.C++ find

8.C++ find_if

9.C++ find_if_not

10.C++ find_first_of

11.C++ adjacent_find

12.C++ find_end

13.C++ search

14.C++ search_n

15.C++ partition

16.C++ partition_copy

17.C++ partition_point

18.C++ binary_search

19.C++ lower_bound

20.C++ upper_bound

21.C++ equel_range

22.C++ all_of、any_of及none_of

23.C++ equal

24.C++ mismatch

25.C++ lexicographical_compare

26.C++ next_permutation

27.C++ prev_permutation

28.C++ is_permutation

29.C++ copy_n

30.C++ copy_if

31.C++ copy_backward

32.C++ reverse_copy

33.C++ unique

34.C++ rotate

35.C++ rotate_copy

36.C++ move

37.C++ swap_ranges

38.C++ remove函数

39.C++ fill和fill_n

40.C++ generate和generate_n

41.C++ transform

42.C++ replace

第7章 随机数

1.C++随机数

2.概率、分布和熵

3.C++ 随机数生成

4.C++随机数生成器

5.C++ uniform_int_distribution

6.C++ uniform_real_distribution

7.C++ generate_canonical

8.C++ normal_distribution

9.C++ lognormal_distribution

10.C++ discrete_distribution

11.piecewise_constant_distribution

12.C++ piecewise_linear_distribution

13.C++ binomial_distribution

14.C++ 随机数生成器和随机数引擎

15.C++线性同余法

16.C++梅森旋转算法

17.C++带进位的线性同余法

第8章 流迭代器

1.C++输入流迭代器

2.C++输出流迭代器

3.C++重载插入运算符和提取运算符

4.流迭代器实现文件操作

5.流缓冲区迭代器

6.string流

第9章 使用数值、时间和复数

1.C++ iota

2.C++ accumulate

3.C++ inner_product

4.C++ adjacent_difference

5.C++ partial_sum

6.C++ min_element、max_element和minmax_element

7.C++ valarray

8.C++ 适用于valarray对象的运算符

9.C++ valarray获取对象

10.C++ gslice

11.C++ duration

12.C++ complex

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL教程:C++ STL快速入门 的相关文章

随机推荐

  • 自动化专业考研方向简介

    自动化专业考研方向简介 xff08 一 xff09 大家在准备考研时 xff0c 想没想过 自己对什么感兴趣 xff1f 自己以后想干什么 xff1f 毕业后如何打算 xff1f 如果你认真考虑了这几个问题 xff0c 相信你的未来研究生生
  • UVA1185 Big Number

    原题 https www luogu com cn problem UVA1185 本题用到的定理的证明 https www cnblogs com weiliuyby p 5831991 html 题目 给出n 求n 的位数 从网上找到了
  • 浅谈威佐夫博弈

    如果不了解威佐夫博弈的话 xff0c 下面有威佐夫博弈的介绍 有两堆石子 xff0c 数量任意 xff0c 可以不同 游戏开始由两个人轮流取石子 游戏规定 xff0c 每次有两种不同的取法 xff0c 一是可以在任意的一堆中取走任意多的石子
  • YBT1325:循环比赛日程表

    我们先看题 我们仔细观察就会发现一下规律 xff1a 设一个数 设两个数 且 1 在的范围内 有 2 在的范围内 有 3 在的范围内 有 以上三条我都验证过了 正确 所以代码就出来了 include lt iostream gt using
  • Codeforces Contest #1553 A : Digit Sum 题解

    题目链接 Digit Sum 题面 将上面一大坨翻译一下 xff0c 就是 xff1a 定义函数的数字和 给出 求有多少个满足且 若模余 xff0c 则成立 一开始想是输出的下取整 xff0c 最后的结果 xff1a 没有考虑到的情况 xf
  • Atcoder Beginner Contest 100 - 题解

    A 原题 Happy Birthday 本题其实很水 只需要输入这两个整数 xff0c 如果中有一个大于 就输出 xff0c 否则输出 Yay include lt bits stdc 43 43 h gt using namespace
  • ubuntu 18.04 server 扩容(LVM)磁盘 解决磁盘不足的情况 (亲测)

    因为发现我的本地server出现磁盘满了的情况 所以进行lvm的扩容 截图的都是扩容后的 所以忽略容量 1 查看磁盘情况 df span class hljs attribute h span 原本发现 dev mapper ubuntu
  • 欢迎使用CSDN-markdown编辑器

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传
  • 工作一年,辞职复习半年,考杭电计算机的经验分享

    工作一年 xff0c 辞职复习半年 xff0c 考杭电计算机的经验分享 如果 xff0c 毕业了工作顺利的人大概率是不会去考研的 xff0c 去考研的人 xff0c 大概率是想改变的 题记 2019 4 6 关于我 纠结的人生 为什么考研
  • CSS表格样式

    文章目录 CSS表格样式caption side 标题位置border collapse 边框合并border spacing 边框间距css样式 xff08 推荐使用 xff09 CSS表格样式 caption side 标题位置 语法
  • Android使用Annotations注解优化代码

    文章目录 Android使用Annotations注解优化代码Null 注解Typedef 注解Resource Type 注解Threading 注解Value Constraints 注解Overriding Methods 注解Ret
  • C语言strstr函数

    函数strstr定义 xff1a char strstr const char str1 const char str2 xff1b 位于头文件 string h 中 作用 xff1a strstr函数用于判断字符串str2是否为字符串st
  • Linux下串口读写通信

    span class token keyword int span fd span class token operator 61 span span class token number 0 span span class token p
  • kubernetes最新版安装单机版v1.21.5

    kubernetes最新版安装单机版v1 21 5 k8s集群由Master节点和Node xff08 Worker xff09 节点组成 今天我在这里给大家只用1台机器 xff0c 安装kubernetes 1 安装前置环境 root 6
  • 双系统、多系统快速切换

    前言 装双系统甚至多系统 xff0c 是为了满足不同需求 每个操作系统都有自身的特点 xff0c 因为这样那样的原因 xff0c 很多人选择双系统 双系统满足了不同需求 xff0c 但是每次需要手动选择所要进入的系统 xff0c 切换系统也
  • ROS::CmakeList 例子

    ROS CmakeList 例子 span class token function cmake minimum required span span class token punctuation span VERSION span cl
  • ROS:静态TF发布

    ROS xff1a 静态TF发布 方式1 xff1a span class token tag span class token tag span class token punctuation lt span launch span sp
  • ROS::线程锁

    ROS xff1a xff1a 线程锁 boost span class token operator span mutex mutex span class token punctuation span span class token
  • 无人机智能飞行类库设计构思

    搭建无人机 智能飞行类库的主要目的就在于 xff1a 便于无人机路径规划各种算法的实施 xff0c 便于飞行仿真以及便于今后在硬件上实现算法 完整做到这些需要做三方面做工作 xff1a 一 计算几何 计算几何问题主要用于路径优化 避障等 x
  • STL教程:C++ STL快速入门

    目录 1 STL引言 2 STL是什么 xff08 STL简介 xff09 3 STL历史 4 STL组件 5 STL基本结构 6 STL 使用方法 7 STL目录 网址 xff1a STL教程 xff1a C 43 43 STL快速入门