第一章 stl概述
1.2 STL内容
1.STL主要包含 容器 算法 迭代器 三大部分
2.STL容器包含了绝大多数数据结构,如数组、链表、队列、堆、栈和树等
3.开发者直接应用这些系统 STL 容器相关函数就可以了,而且这些函数都是带模板参数的,可以适应许多数据元素类型,功能非常强大
4.STL 算法包含了诸如增、删、改、查和排序等系统函数,开发者可以直接操作这些函数实现相应功能
5.STL 迭代器类似指针,通过它的有序移动把容器中的元素与算法关联起来,它是实现所有 STL 功能的基础所在。
🔺常用STL包含文件:
选代器: #include <iterator>
输入输出流 :标准输入输出流#include <iostream>
文件输人输出流#include <fstream>
字符串输入输出流# include <sstream>
字符串:#include <string>
函数对象:#include <functional>
通用容器:向量容器#include <vector>
双端队列#include <deque>
链表容器# include <list>
队列、优先队列#include <query>
堆栈#include <stack>
集合、多集合、位集合#include <set>
映射,多映射#include <map>
通用算法:#include <algorithm>
数值算法:#include <numeric>
PS:STL的包含文件都不加扩展名,以便与 C语言风格的“.h”头文件相区别
1.3 命名空间
STL程序中一般需要加“using namespace std;”这属于命名空间的应用,关键字是namespace
在 C++ 中,名称可以是变量、函数、结构、枚举以及类和结构的成员。
名称相互冲突的解决办法:C++ 提出了 namespace 命名空间解决方法,只要再加一层封装就可以了。/
/这段代码展示了命名空间的使用方法。命名空间提供了一种将相关的代码组织在一起并避免命名
//冲突的机制。在这个例子中,mycompany和yourcompany命名空间分别包含了具有相同名称的func函数,
//但由于命名空间的存在,它们不会相互冲突,可以在不同的作用域中使用。
#include<stdio.h>
//代码使用namespace关键字定义了一个命名空间mycompany
//其中包含一个名为func的函数
namespace mycompany
{
void func()
{
printf("hello,this is my comany");
}
};
//代码使用namespace关键字定义了另一个命名空间yourcompany
//其中也包含一个名为func的函数
namespace yourcompany
{
void func()
{
printf("hello,this is your comany");
}
};
//在main函数中,通过使用using namespace mycompany;语句,
//代码引入了mycompany命名空间,使得命名空间中的符号(包括函数func)
//在main函数中可见
using namespace mycompany;
//系统通过将命令参数传给main 函数中argv参数保存参数值,argc是记录argv、//中保存命令参数的个数用的, 所以argc是int型参argv是字符串型数组参数。
//main函数是一个程序的入口函数。但是,只要函数运行,就一定会被人调用。//而main函数则是被系统自动调用
int main(int argc,char* argv[])
{
//码调用func()函数,这里的func()调用实际上是调用了mycompany命名空间中的func()函数
//因为之前使用了using namespace mycompany;语句
func();
printf("\n");
//使用yourcompany::func()语法调用了yourcompany命名空间中的func()函数,
//这样就打印输出了"hello, this is your company"
yourcompany::func();
printf("\n");
return 0;
}
1.4 习题
1. STL 中算法中,大量使用的技术是( )
A. 继承 B. 虚函数 C. 模板 D. 封装
2、下列的模板说明中,正确的是( )。
A、template<class T1,T2>;
B、template<typename T1,typename T2>;
C、template<class T1 ; class T2>;
D、template<typename T1,T2>
A D中的 template<class T1, T2>;错误,因为模板参数列表中的每个参数都需要使用关键字 class 或 typename 进行声明
C 中的 template<class T1; class T2>; 也是错误的,因为在模板参数列表中的每个参数声明之间不需要分号
3.若定义如下函数模板:
Template<typename T>
Max(T a,T b,T &c)
{
c=a+b;
}
则下列M ax()函数模板能够调用成功的选项是(B )。
A.int x,y;char z;M ax(x,y,z);
B.double x,y,z;M ax(x,y,z);//三个参数的类型必须相同
4.Stl常用的数据结构不包过
A.栈 B.列表 C.队列 D.图
5.stl主要包括 容器,算法,迭代器三大部分,其中容器分为序列性容器,关联性容器和容器适配器三类。Stl容器包含了绝大多数数据结构,如:数组,链表,队列,堆,栈,树等。
6.一个动态模板类,把与内存管理的部分进一步抽象,编译成代码,实现了内存的动态分配和释放
7.动态数组模板类体现了STL容器关于内存“动态分配,销毁,再分配的思想”
8.(判断题)“using namespace std”属于名字空间域的运用 答案:正确
9.模板:函数模板和类模板
非函数模板转化为函数模板:增加一行模板参数声明template<class T>,再将所有的int用T代替。
10.什么是stl?
STL是标准模板库(Standard template library),STL包含容器、算法、迭代器三大部分
STL容器包含了绝大多数数据结构,如数组、链表、队列、堆、栈、树等 。
STL算法包含了诸如增、删、改、查、排序等系统函数 。
STL迭代器类似指针一样,通过它的有序移动,把容器中的元素与算法关联起来,它是实现所有STL功能的基础所在。
11.算法、迭代器与容器的关系:
算法是通过迭代器操作容器。每个容器都有相应的迭代器,容器通过迭代器共享某一具体算法,某一具体算法不依附于某一具体容器,迭代器起到一个中间媒介作用,把容器和算法连接起来。迭代器思维是编制通过泛型算法发展的必然结果,算法通过迭代器依次访问容器中的元素。容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
12.STL与模板的关系:
模板分两种类型:函数模板和类模板。函数模板提供编译代码过程中 的文本替换功能;类模板可以编写通用的、类型安全的类。