C++编程:高阶编程

2024-08-29 03:28
文章标签 c++ 编程 高阶

本文主要是介绍C++编程:高阶编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

         本阶段主要针对泛型编程和STL技术作详细讲解。

1 模板

1.1 模板的概念

C++提供一种泛型编程,主要利用模板的技术,模板的目的是提高代码复用性,将类型参数化。

C++提供两种模板机制:

  • 函数模板
  • 类模板

模板的特点:

  • 模板不可用直接使用,它指数一个框架;
  • 模板的通用表示万能的,也是由使用范围的。

 

1.2 函数模板

函数模板的作用:建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,而是用一个虚拟的类型来代表。

语法:

template<typename/class T>

template:声明创建模板

typename/class:表明其后面的符号是一种数据类型

T:通用的数据类型,该名称可以替换,通常为大写字母

1.2.1 函数模板的创建与使用

语法:

//声明一个模板,告诉编译器后面紧跟的代码中的T不要报错,T是一个通用类型

template<typename T>

//模板使用的两种方式:1.自动类型推导;2.显示指定类型
//1.自动类型推导
mySwap(a,b);

//2.显示指定类型
mySwap<int>(a,b);

码如下:

#include <iostream>
using namespace std;//函数模板//交换两个整形的函数
void swapInt(int a,int b)
{int temp=a;a=b;b=temp;
}//交换两个浮点数的函数
void swapDouble(double a,double b)
{double temp=a;a=b;b=temp;
}//函数模板
template<typename T>//声明一个模板,告诉编译器后面紧跟的代码中的T不要报错,T是一个通用类型
void mySwap(T &a, T &b)
{T temp=a;a=b;b=temp;
}void test01()
{int a=4;int b=10;//swapInt(a,b);//利用模板交换,两种方式:1.自动类型推导;2.显示指定类型//1.自动类型推导///mySwap(a,b);//2.显示指定类型mySwap<int>(a,b);cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;double c=4.66;double d=3.22;swapDouble(c,d);//mySwap(a,c);//错误示例1:自动类型推导,必须推导出一致的数据类型T才能使用cout<<"c="<<c<<endl;cout<<"d="<<d<<endl;
}template<class T>
void func()
{cout<<"this is func()"<<endl;
}void test02()
{//func();//错误示例2:模板必须确定T的数据类型才能使用
}int main()
{test01();test02();return 0;
}

注意事项:

  • 自动类型推导,必须推导出一致的数据类型T才能使用
  • 模板必须确定T的数据类型才能使用

错误示例1:

错误示例2:

1.2.2 函数模板案例

案例描述:

  • 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
  • 排序规则为从大到小,排序算法为选择排序
  • 分别利用char数组和int数组进行测试

代码如下:

#include <iostream>
using namespace std;//函数模板案例:对不同数据类型的数组进行从大到小的选择排序
template<class T>
void mySort(T buff[],int len)
{for(int i=0;i<len;i++){int max=i;for(int j=i+1;j<len;j++){if(buff[j]>buff[max]){max=j;}}if(max!=i){T temp=buff[i];buff[i]=buff[max];buff[max]=temp;}}
}template<class T>
void printArry(T buff,int len)
{for(int i=0;i<len;i++){cout<<buff[i]<<endl;}
}//测试char数组
void test01()
{char arr[]="abcdef";int len=sizeof(arr)/sizeof(char);mySort(arr,len);printArry(arr,len);}//测试int数组
void test02()
{int arr[]={2,4,6,8,3,1};int len=sizeof(arr)/sizeof(int);mySort(arr,len);printArry(arr,len);
}int main()
{test01();test02();return 0;
}

输出如下:

写错的地方:

1.选择排序比较两个数的大小是用第j个和最大的数比较if(buff[j]>buff[max]),而不是和第i个比较if(buff[j]>buff[i])。

2.计算数组长度时忘记除以数据类型的长度sizeof(arr)/sizeof(int)

考究的地方:

向函数传递数组时似乎可以只写数组名void printArry(T buff,int len),而不一定要写中括号void mySort(T buff[ ],int len)。

1.3  类模板

2 STL

3 容器

3.1 string容器

3.2 vector容器

3.3 deque容器

3.4 stack容器

3.5 queue容器

3.6 list容器

3.7 set容器

3.8 map容器

4 谓词

5 内建函数对象

6 常见算法

6.1 遍历算法

6.2 查找算法

6.3 排序算法

6.4 拷贝和替换算法

6.5 算术生成算法

6.6 集合算法

7综合案例

这篇关于C++编程:高阶编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1116708

相关文章

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应