• STL技术——STL概述和入门


    STL技术——STL概述和入门

    1、STL简介

    STL介绍

    STL( standard template library),译为标准模板库或者泛型库,是 C++ 提供的一个基础模板的集合。

    STL 已完全被内置到支持 C++ 的编译器中,不用另外安装。

    STL广义上可以分为:容器container(本质上就是封装有数据结构的模板类)、算法algorithm、迭代器iterator;容器和算法之间通过迭代器无缝连接。

    STL 就位于各个 C++ 的头文件中,即它并非以二进制代码的形式提供,而是以源代码的形式提供,并且STL几乎所有代码都采用了模板类或模板函数。

    STL版本

    因为STL是开源的,所以各个 C++ 编译器厂商在此标准的基础上都实现了满足自己需求的 C++ STL 泛型库,主要包括 HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等。

    STL六大组件

    STL大体分为6大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

    • 容器:各种数据结构,如vector(常用)、list、deque、set、map等,用来存放数据

    • 算法:各种常见的算法,如sort、find、copy、for_each等

    • 迭代器:扮演了容器和算法之间的粘合剂

    • 仿函数:行为类似于函数,可做算法的某种策略

    • 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西

    • 空间配置器:负责空间的配置和管理

    容器种类和功能

    序列式容器:主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。由于元素在容器中的位置与元素的值没有关系,也就是说,容器没有被排列好,因此被称作序列式容器。当我们将一个元素插入到一个容器中时,要指定该元素所在的位置。

    排序式容器:包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。在排序容器中,元素的预设顺序是从小到大,即使是在插入一个元素时,它们也会被插入到合适的地方。因此,当查询时,性能方面关联容器表现得很好。

    哈希式容器:C++11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射和 unordered_multimap 哈希多重映射。哈希式容器和排序容器不同的地方在于:哈希容器中的元素是未排序的,元素的位置由哈希函数确定。

    2、入门案例

    2.1、vecto存放内置数据类型

    #include
    #include
    #include
    using namespace std;
    
    //回调函数
    void myPrint(int val)
    {
    	cout << val << endl;
    }
    
    void test1()
    {
    	//创建int类型的容器
    	vector<int> v;
    	//添加元素
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(30);
    	v.push_back(40);
        
    	//遍历容器方式一:
    	//起始迭代器,指向容器第一个元素
    	//vector::iterator itBegin = v.begin();
    	//结束迭代器,指向容器最后一个元素的下一个位置
    	//vector::iterator itEnd = v.end();
    	//while (itBegin!= itEnd)
    	//{
    	//	cout << *itBegin << endl;
    	//	itBegin++;
    	//}
    	
        //遍历容器方式二(常用):for循环
    	//for (vector::iterator itBegin  = v.begin(); itBegin!=v.end(); itBegin++)
    	//{
    	//	cout << *itBegin << endl;
    	//}
    	
        //遍历容器方式三:foreach算法
    	for_each(v.begin(), v.end(), myPrint);
    	
    }
    
    int main()
    {
    	test1();
    	system("pause");
    	return 0;
    }
    

    push_back:在 vector 容器尾部添加一个元素

    2.2、vecto存放自定义数据类型

    #include
    using namespace std;
    #include
    #include
    
    //vector存放自定义数据类型
    class Person {
    public:
    	Person(string name, int age) {
    		this->m_Name = name;
    		this->m_Age = age;
    	}
    	string m_Name;
    	int m_Age;
    };
    
    void myPrint(Person p)
    {
    	cout << "姓名为" << p.m_Name << " 年龄为" << p.m_Age << endl;
    }
    
    void test01() {
    	Person p1("qq", 12);
    	Person p2("wq", 13);
    	Person p3("eq", 14);
    	Person p4("rq", 15);
    	Person p5("tq", 16);
    
    	vector<Person> v;
    	v.push_back(p1);
    	v.push_back(p2);
    	v.push_back(p3);
    	v.push_back(p4);
    	v.push_back(p5);
    
    	for_each(v.begin(), v.end(), myPrint);
    
    }
    
    //存放自定义数据类型的指针
    void test02() {
    	Person p1("qq", 12);
    	Person p2("wq", 13);
    	Person p3("eq", 14);
    	Person p4("rq", 15);
    	Person p5("tq", 16);
    
    	vector<Person*> v;
    	v.push_back(&p1);
    	v.push_back(&p2);
    	v.push_back(&p3);
    	v.push_back(&p4);
    	v.push_back(&p5);
    
    	vector<Person*>::iterator itBegin = v.begin();
    	vector<Person*>::iterator itEnd = v.end();
    
    	for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++) {
    		cout << "姓名为" << (*it)->m_Name << " 年龄为" << (*it)->m_Age << endl;
    
    	}
    }
    int main() {
    	test01();
    	cout << "-----------------------" << endl;
    	test02();
    	system("pause");
    	return 0;
    }
    

    2.3、容器嵌套

    #include
    using namespace std;
    #include
    
    //vector嵌套容器
    void test03() {
    	vector<vector<int>> v;
    	//创建小容器
    	vector<int> v1;
    	vector<int> v2;
    	vector<int> v3;
    	vector<int> v4;
    	for (int i = 0; i < 4; i++) {
    		v1.push_back(i + 1);
    		v2.push_back(i + 2);
    		v3.push_back(i + 3);
    		v4.push_back(i + 4);
    	}
    	//把小容器放到大容器中
    	v.push_back(v1);
    	v.push_back(v2);
    	v.push_back(v3);
    	v.push_back(v4);
    
    	for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++) {
            //(*it)----vector
    		for (vector<int>::iterator vIt = (*it).begin(); vIt != (*it).end(); vIt++) {
    			cout << *vIt << " ";
    		}
    		cout << endl;
    	}
    }
    int main() {
    	test03();
    	system("pause");
    	return 0;
    }
    
  • 相关阅读:
    Linux系统中驱动之设备树的platform驱动实现
    Docker常用命令
    迎战秋招计划
    2.13日学习打卡----初学RocketMQ(四)
    windows c++ 输出所有服务列表,并判断是否是开机启动项
    springboot系列(二十三):如何实现Excel文件导入?这你得会 | 超级详细,建议收藏
    【Android】界面是如何刷新的流程
    基于Ingress实现灰度发布(金丝雀发布)和蓝绿发布
    jenkins-2.426.1-1.1.noarch.rpm 的公钥没有安装
    Android之自定义相册文件选择器
  • 原文地址:https://blog.csdn.net/wpc2018/article/details/127103767