An's Blog
收藏、分享 …
Toggle navigation
Home
Cesium
SuperMap
ArcGIS
MapboxGL
CentOS
GeoServer
Favorites
Archives
Tags
C++标准库(STL)
2023-08-31 09:51:02
21
0
0
admin
# **一、C++标准库简介** C++标准定义了庞大且功能丰富的标准库,其内容分为10类,包括:**C1语言支持、C2输入/输出、C3诊断功能、C4通用工具、C5字符串、C6容器、C7迭代器、C8算法、C9数值操作、C10本地化** C++标准库所有的头文件都**没有扩展名(.h)**,内容总共在51个标准头文件中定义。其中18个< cname >形式的头文件( < complex >除外)内容与标准C语言的name.h头文件相同,但包含了C++扩展的功能在< cname >形式的头文件中,与宏相关的名称在全局作用域中定义,其他名称在std命名空间中声明另外,在C++中还可以使用name.h形式的C语言头文件,但不建议这样用。    # **二、C++标准库组成** 首先,C++的标准库其分类如下图所示,包含: - **C标准库**:由C标准库扩展而来,强调结构、函数和过程,不支持面向对象技术。 - **C++库**:包括C++ I/O库、String库、数值库等 - **标准模板库(STL)**:高效的C++程序库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。 以上库文件都被定义在namespace std中,C++库可以不规定头文件的扩展名。本文重点介绍一下STL库  ## **1. C标准库** (1)< cmath >:提供给了22个不同的数学函数,如abs(),sqrt(),exp()等 (2)< cstdlib >:提供了常用的数学函数,3个特殊函数和2个常量 exit():退出程序,清理静态对象 abort():强制退出程序 atexit():将一个函数作为参数并在程序退出时调用 EXIT_SUCCESS:程序已经正常完成 EXIT_FAULURE:程序正常结束 (3)< cassert >:定义了一个函数assert,用来测试一个条件,并在条件为假时强制程序退出。通常用来判断内存分配是否成功 (4)< cctype >:提供了确定字符类型的功能。可以判断一个字符是否为数字字符,图形字符,小写,大写或空格,并可以将字符进行大小写转换 (5)< cerrno >:定义了一个变量,用它可以确定程序中发生的错误的类型 ## **2. C++库** (1)< string >:支持字符串处理的类库 (2)< complex >:提供了复数的表示和算法 float_complex类 double_complex类 long_double_complex类 (3)< ios >:定义了I/O流类的虚基类ios,通常不直接用它 (4)< iostream >:标准I/O流类库,提供了cin,cout等全局对象类来支持输入输出功能 (5)< istream >:输入流类库 (6)< ostream >:输出流类库 (7)< fstream >:读写文件的类 ## **3. 标准模板库(STL)** STL包括六大组件,其中尤以容器、算法、迭代器为核心  **容器:**用来管理某一类对象的集合,根据实现方式的不同,分为有序列表,无序列表和映射。C++ 提供了各种不同类型的容器,比如: **deque、list、vector、map** 等。 **算法:**作用于容器。它们提供了执行各种操作的方式,包括**对容器内容执行初始化、排序、搜索和转换等**操作。 **迭代器:**用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。 实例: #include <iostream> #include <vector> using namespace std; int main() { // 创建一个存储int类型的向量vec vector<int> vec; int i; // 显示 vec 的原始大小 cout << "vector size = " << vec.size() << endl; // 推入 5 个值到向量中 for(i = 0; i < 5; i++){ vec.push_back(i); } // 显示 vec 扩展后的大小 cout << "extended vector size = " << vec.size() << endl; // 访问向量中的 5 个值 for(i = 0; i < 5; i++){ cout << "value of vec [" << i << "] = " << vec[i] << endl; } // 使用迭代器 iterator 访问值 vector<int>::iterator v = vec.begin(); while( v != vec.end()) { cout << "value of v = " << *v << endl; v++; } return 0; } 结果: vector size = 0 extended vector size = 5 value of vec [0] = 0 value of vec [1] = 1 value of vec [2] = 2 value of vec [3] = 3 value of vec [4] = 4 value of v = 0 value of v = 1 value of v = 2 value of v = 3 value of v = 4 ### **(1)vector** ① **初始化:** vector<数据类型> 变量名称; #include <vector> std::vector<int> obj_1;//创建一个向量存储容器 int std::vector<float> obj_2;//创建一个向量存储容器 float std::vector<double> obj_3;//创建一个向量存储容器 double ② **输出与索引:** //方法一:直接法 for(int i = 0;i < obj.size(); i++) //size()容器中实际数据个数 { cout << obj[i] << ","; } //方法二:使用迭代器将容器中数据输出 vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 for(it=obj.begin();it!=obj.end();it++) { cout << *it << " "; } ③ **插值:** for(int i = 0;i < 10; i++) // push_back(elem)在数组最后添加数据 { obj.push_back(i); cout << obj[i] << ","; } ④ **清除数据:** obj.clear(); //清除容器中所有数据 参考:https://www.runoob.com/w3cnote/cpp-vector-container-analysis.html ### **(2)map** map是STL的一个关联容器,可以将其翻译为映射,类似与python中字典(dict)数据格式,都是key-value式的存储方式。而key和value可以是任意你需要的类型,包括自定义类型。 ① **初始化:** 使用map需包含map类所在的头文件: #include <map> #include <string> using namespace std; // 定义一个map对象,其中key(id)是int类型,value(name)是string类型 map<int, string> students_id_name; ② **插入元素:** students_id_name.insert(pair<int, string>(001, "Ann")); students_id_name.insert(pair<int, string>(002, "Bob")); students_id_name.insert(pair<int, string>(003, "Cindy")); ③ **查找元素:** map<int,string>::iterator iter; // find 返回迭代器指向当前查找元素的位置否则返回map::end()位置 iter = students_id_name.find(001); if(iter != students_id_name.end()) cout << "Find, the name is" << iter->second << endl; else cout << "Do not Find" << endl; ### **(3)deque(队列)** 与Vector 容器为单向开口不同,deque 则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,其操作如图所示:  ① **初始化:** 使用deque需包含deque类所在的头文件: #include <deque> using namespace std; int main() { //初始化一个空deque容量 deque<int>d; //向d容器中的尾部依次添加 1,2,3 d.push_back(1); //{1} d.push_back(2); //{1,2} d.push_back(3); //{1,2,3} //向d容器的头部添加 0 d.push_front(0); //{0,1,2,3} /* 初始化 */ deque<int> d2(d.begin(), d.end()); d2.push_back(10000); /* 交换 */ d.swap(d2); }
Pre:
OpenSceneGraph基础知识
Next:
C++入门基础
0
likes
21
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Table of content