【C++】模板与STL库

news2024/10/3 0:30:27

STL(标准模板库)

文章目录

    • 模板
    • STL

模板

模板是泛型编程的基础,泛型编程以一种独立于任何特定类型的方式编写代码。

模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector 。

函数模板的一般形式:

template <typename type> ret-type func-name(parameter list)
{
   // 函数的主体
}

函数模板实例,返回两个数中的最大值:

#include <iostream>
#include <string>
 
using namespace std;
 
template <typename T>
inline T const& Max (T const& a, T const& b) 
{ 
    return a < b ? b:a; 
} 
int main ()
{
 
    int i = 39;
    int j = 20;
    cout << "Max(i, j): " << Max(i, j) << endl; 
 
    double f1 = 13.5; 
    double f2 = 20.7; 
    cout << "Max(f1, f2): " << Max(f1, f2) << endl; 
 
    string s1 = "Hello"; 
    string s2 = "World"; 
    cout << "Max(s1, s2): " << Max(s1, s2) << endl; 
 
    return 0;
}

运行结果:

在这里插入图片描述

和函数模板一样,也可以定义类模板,一般形式如下:

template <class type> class class-name {
.
.
.
}

type 是占位符类型名称,可以在类被实例化的时候进行指定。

类模板的例子:

#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>

using namespace std;

template <class T>
class Stack {
private:
	vector<T> elems;     // 元素 

public:
	void push(T const&);	 // 入栈
	void pop();               // 出栈
	T top() const;            // 返回栈顶元素
	bool empty() const {       // 如果为空则返回真。
		return elems.empty();
	}
};

template <class T>
void Stack<T>::push(T const& elem)
{
	// 追加传入元素的副本
	elems.push_back(elem);
}

template <class T>
void Stack<T>::pop()
{
	if (elems.empty()) {
		throw out_of_range("Stack<>::pop(): empty stack");
	}
	// 删除最后一个元素
	elems.pop_back();
}

template <class T>
T Stack<T>::top() const
{
	if (elems.empty()) {
		throw out_of_range("Stack<>::top(): empty stack");
	}
	// 返回最后一个元素的副本 
	return elems.back();
}

int main()
{
	try {
		Stack<int>         intStack;  // int 类型的栈 
		Stack<string> stringStack;    // string 类型的栈 

		// 操作 int 类型的栈 
		intStack.push(7);
		cout << intStack.top() << endl;

		// 操作 string 类型的栈 
		stringStack.push("hello");
		cout << stringStack.top() << std::endl;
		stringStack.pop();
		stringStack.pop();
	}
	catch (exception const& ex) {
		cerr << "Exception: " << ex.what() << endl;
		return -1;
	}
}

运行结果:

在这里插入图片描述

STL

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

STL主要包含三个组件:

  • 容器(Containers):管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
  • 算法(Algorithms):算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
  • 迭代器(iterators):用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

vector的实例(vector与array十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求):

#include <iostream> 
#include <vector> 
#include <array> 
using namespace std;
int main()
{
	std::vector<int> demo{ 1,2 };

	demo.push_back(1);	//push_back操作
	
	std::vector<int>test{ 345 };
	demo.insert(demo.end(), test.begin(), test.end());//inset操作

	// 循环打印值
	for (int i = 0; i < demo.size(); i++) {
		cout << demo[i] << " ";
	}

	// 使用迭代器 iterator 访问值
	vector<int>::iterator v = demo.begin();
	while (v != demo.end()) {
		cout << "value of v = " << *v << endl;
		v++;
	}
	return 0;
}

运行结果:

在这里插入图片描述

STL 中的大部分常用算法都在头文件 algorithm 中定义。此外,头文件 numeric 中也有一些算法。

find的用法:

#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main() 
{
	int a[10] = { 10,20,30,40 };
	vector<int> v;
	v.push_back(1);    v.push_back(2);
	v.push_back(3);    v.push_back(4); //此后v里放着4个元素:1,2,3,4

	// 定义迭代器,用find查找
	vector<int>::iterator p;
	p = find(v.begin(), v.end(), 3); //在v中查找3
	if (p != v.end()) //若找不到,find返回 v.end()
		cout << "1. " << *p << endl; //找到了
	p = find(v.begin(), v.end(), 9);
	if (p == v.end())
		cout << "not found " << endl; //没找到

	p = find(v.begin() + 1, v.end() - 1, 4); //在,3 这两个元素中查找4
	cout << "2. " << *p << endl;

	int * pp = find(a, a + 4, 20);
	if (pp == a + 4)
		cout << "not found" << endl;
	else
		cout << "3. " << *pp << endl;

	return 0;
}

运行结果:

在这里插入图片描述

以上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性判别分析仅在线性可分数据上能获得理想结果

Q: 线性判别分析仅在线性可分数据上能获得理想结果, 试设计一个改进方法, 使其能较好地用于飞线性可分数据 The same for “Linear discriminant analysis can only obtain ideal results on linearly separable data. Try to design an improved method to make it better us…

Vue3:自定义指令以及简单的后台管理权限封装

目录 前言&#xff1a; 自定义指令介绍&#xff1a; 局部的自定义指令&#xff1a; 全局自定义指令&#xff1a; 讲讲后台管理权限管理&#xff1a; 前言&#xff1a; 说起这个自定义指令的使用场景&#xff0c;我第一反应就是&#xff0c;后台管理的权限管理&#xff0c;要…

VBA学习——1

VBA 过程的基本语法如下&#xff1a; Sub 过程名(参数)语句1语句2...End SubVBA 函数与 VBA 过程很相似&#xff0c;除了使用的关键词外&#xff0c;主要区别是&#xff0c;函数可以返回值。 Function [函数名]([参数]) As [返回值类型]语句1 语句2 ... 语句n [函…

Servlet笔记(9):Cookie处理

一、Cookies处理 1、Cookies概念 Cookies是存储在客户端计算机上的文本文件&#xff0c;并保留各种跟踪信息。 识别返回用户的三个步骤 服务器脚本向浏览器发送一组Cookies。例如姓名、年龄或识别号码等。浏览器将这些信息存储在本地计算机上。当下一次浏览器向Web服务器发送…

SSM+HTML搭建(小白教学)

最近做项目,觉得还是有意义记录以下前后端框架是怎么搭建的,今天给大家介绍介绍SSM:SpringBootSpringMVCMyBatis后端搭建:SpringBoot快速搭建的网站(Spring Initializr)选择创建之后,会下载到一个zip压缩包,对压缩包进行解压(包地址一般选择后端项目的放的文件夹中)用idea打开项…

每日学术速递2.24

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.LG 1.BUAA_BIGSCity: Spatial-Temporal Graph Neural Network for Wind Power Forecasting in Baidu KDD CUP 2022 标题&#xff1a;BUAA_BIGSCity&#xff1a;百度KDD CUP 2022风电预测…

警惕!黑客正疯狂实施网络攻击,网站该如何防范?

自2021年以来&#xff0c;ATW组织宣称披露涉我国重要信息系统源代码、数据库等敏感信息70余次&#xff0c;涉及国家重要政府部门、航空、基础设施等100余家单位的300余个信息系统&#xff0c;尤其2022年以来&#xff0c;ATW组织滋扰势头加剧&#xff0c;持续对中国的网络目标实…

数据结构预算法之买股票最好时机动态规划(可买卖多次)

一.题目二.思路在动规五部曲中&#xff0c;这个区别主要是体现在递推公式上&#xff0c;其他都和上一篇文章思路是一样的。所以我们重点讲一讲递推公式。这里重申一下dp数组的含义&#xff1a;dp[i][0] 表示第i天持有股票所得现金。dp[i][1] 表示第i天不持有股票所得最多现金如…

【Http1.0和Http1.1的区别?Http1.1和Http2.0的区别?】

计算机网络面试的相关知识你可不能不知道呀&#xff01;Http1.0和Http1.1的区别&#xff1f;Http1.1和Http2.0的区别&#xff1f; Http1.0和Http1.1的区别&#xff1f; 连接方式 : HTTP 1.0 为短连接&#xff0c;HTTP 1.1 支持长连接。状态响应码 : HTTP/1.1中新加入了大量的状…

小型水库大坝安全监测的主要对象

一、监测背景 大坝监测的目的分成两个大的方面&#xff0c;一方面是为了验证设计、指导施工、为科研提供必要的资料&#xff1b;另一方面&#xff0c;也可以说是更重要的方面&#xff0c;就是为了长期监视大坝的安全运行。因此&#xff0c;一个成功的监测设计者不仅要能充分领会…

Vmware 虚拟机无法联通主机

问题描述&#xff1a;今天使用Vmware Workstation 创建CentOS-7 虚拟机&#xff0c;基于CentOS-7 搭建Hadoop3 伪分布式版本&#xff0c;CentOS-7 测试Hadoop 3 服务正常启动&#xff0c;通过主机连接Hadoop 3的管理平台&#xff0c;提示如下错误信息&#xff1a;尝试解决办法&…

Android---Handler 源码解析

在 android 开发中&#xff0c;经常会在子线程中进行一些操作&#xff0c;当操作完后会通过 handler 发送一些数据给主线程&#xff0c;通知主线程做响应的操作。原理&#xff1a;子线程 handler 主线程&#xff0c;其实构成了线程模型中的经典问题&#xff0c;生产者-消费者模…

HHDESK文本对比功能

对比文件夹和图片而言&#xff0c;文本的更改更加频繁且琐碎&#xff1b;个别词语的更改更是让人“健忘”。 如果有一款工具能够直观的对文本进行对比&#xff0c;并且清晰的划分显示&#xff0c;那么便可以大量节约办公人员的精力和时间。 1 文本对比功能简介 版本更新&…

Ubuntu20.04配置深度学习环境

Ubuntu20.04配置深度学习环境 对于一台新Ubuntu20.04主机&#xff0c;想要直接进行深度学习模型的训练&#xff0c;需要进行一些常规配置。本文针对的情况包括物理机和虚拟机。安装部分本文不介绍&#xff0c;只介绍配置环境部分。 1. 安装中文输入法 参考如下博客&#xff…

Web安全最详细学习路线指南,从入门到入职(含书籍、工具包)

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发 安全研究&#xff1a;二进制方向 安全研究&#xff1a;网络渗透方向 下面逐一说明一下. 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#x…

《卓有成效的管理者》系列-总结篇

作者【美】彼得-德鲁克简介书中提到&#xff0c;每一位知识工作者其实都是管理者&#xff0c;而且卓有成效是每个管理者必须做到的事。书中认为所有负责行动和决策而且能够提高机构工作效率的人&#xff0c;都应该像管理者一样工作和思考。而且&#xff0c;一位卓有成效的管理者…

自考都有哪些科目?怎么搭配报考?

第一次自考科目搭配 先报理论课&#xff0c;熟悉学习和考试套路 参考搭配模式&#xff1a; 一、全报考公共课 公共课难度较低&#xff0c;通过率高&#xff0c;复习起来比较轻松。对于不确定考什么专业&#xff0c;后期想换专业的同学&#xff0c;考过公共课&#xff0c…

记一次Binder内存不足导致的应用被杀

每个进程的可用Binder内存大小是 1M-8KB 也就是900多KB 事情的起因的QA压测过程发生进程号变更&#xff0c;怀疑APP被杀掉过&#xff0c;于是开始看日志&#xff08;实际后来模拟的时候可以发现app确实被杀掉了&#xff09; APP的压测平台会上报进程号变更时间点&#xff0c;发…

基于C++环境的gRPC安装配置:vcpkg+CMake+VS2022

前言gRPC 是 Google 提供的一个 RPC 框架&#xff0c;用于在网络上实现多个应用程序之间的通信。gRPC的优点是支持多种语言&#xff0c;因此可以轻松使用C应用程序与Go或Python应用程序进行通信。尽管CSDN、知乎有很多讲解gRPC在C环境安装的文章&#xff0c;其中最常见的是使用…

LaneAF论文解读和代码讲解

论文地址&#xff1a;https://arxiv.org/abs/2103.12040 一、论文简介 LaneAF是一个语义分割聚类后处理的一种方法。相对于之前的用聚类算法对embedding分支聚类的方法&#xff0c;该论文提出了水平和垂直两个向量场&#xff0c;用来取缔之前的普通聚类。根据向量场就可以完成…