C++学习笔记之模板篇
时间:2022-04-23
本文章向大家介绍C++学习笔记之模板篇,主要内容包括一、模板、类模板、二、标准模板库、2.迭代器、3.链表list、4.映射map、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
一、模板
不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.h文件和.c文件,需要写成一个文件。
函数模板
关键字:
- template:用于声明模板
- typename,class:声明类型,作用相同,不过建议用typename
1.类型作为模板参数 举个例子:
template <class T>
T max(T a,T b)
{
return (a>b)?a:b;
}
int ival = max<int>(100,99);
2.变量作为模板参数 举个例子:
template <int size>
void display()
{
cout<<size<<endl;
}
display<10>();
3.多参数函数模板 举个例子
template <typename T,typename C>
void display(T t,C c)
{
cout<<t<<c<<endl;
}
int a = 666;
string str = "marsggbo";
dispaly<int,string>(a,str);
4.数据类型和变量混用 还是举个栗子:
template <typename T,int size>
void display(T t)
{
int i = 0;
while(i++<size)
{
cout<<t<<endl;
}
}
dispaly<int,6>(6);
类模板
template <typename T>
class A
{
public:
A(T a);
T display()
{
return A.a;
}
private:
T a;
}
每定义一个成员函数时都需要在前面加上template关键字,另外在类名后还需要加上类型,即 <T> ,举个栗子:
template <typename T>
A::A(T x)
{
A.a = x;
}
template <typename T>
T A<T>::display()
{
...
}
实例化类模板
int main(void)
{
A<int> test;
test.display();
return 0;
}
二、标准模板库
1. vector
- vector初始化
- vector常用函数
特别注意,end() 返回的是向量迭代器末元素的下一个元素,所以如果要访问最后一个元素,表达式是这样的: *(--vector.end()) ,(ps:注意前面有个*号)
代码示例: 记得引入vector头文件
#include <iostream>
#include <vector>
using namespace std;
int main (void)
{
vector<int> vec(6,6); // 初始化为6个6
vec.push_back(5); // 在末尾插入一个数据
cout<<vec.size()<<endl; //vector的长度(数据数量)
vec.pop_back(); // 删除末尾的一个数据
cout<<vec.size()<<endl;
// 遍历
for(int i=0;i<vec.size();i++)
{
cout<<vec[i]<<endl;
}
return 0;
}
>>>
7
6
6
6
6
6
6
6
2.迭代器
迭代器相当于指针,要想访问数据,需要加上*号 直接看栗子吧
int main(void)
{
vector<string> vec(2,"hello ");
vec.push_back("marsggbo");
vector<string>::iterator citer = vec.begin();
cout<<*(--vec.end())<<endl;
for(;citer!=vec.end();citer++){
cout<< *citer << endl;
}
return 0;
}
>>>
marsggbo
hello
hello
marsggbo
3.链表list
注意链表遍历的时候不能使用取下标的方式,只能通过迭代器进行遍历。
int main(void)
{
list<int> t;
t.push_back(6);
t.push_back(65);
t.push_back(66);
list<int>::iterator itor = t.begin();
for(;itor!=t.end();itor++)
{
cout<<*itor<<endl;
}
return 0;
}
4.映射map
这个有点类似于Python中的字典。使用的关键字是map和pair
使用示例:
int main(void)
{
map<int,string> m;
pair<int ,string> p1(666,"marsggbo");
pair<int ,string> p2(222,"hexin");
m.insert(p1);
m.insert(p2);
cout<<m[666]<<endl;
cout<<m[222]<<endl;
return 0;
}
>>>
marsggbo
hexin
map的遍历方法:(还是以上面的例子做基础)
int main(void)
{
map<int,string> m;
pair<int ,string> p1(666,"marsggbo");
pair<int ,string> p2(222,"hexin");
m.insert(p1);
m.insert(p2);
map<int,string>::iterator itor = m.begin();
for(;itor!=m.end();itor++)
{
cout<< itor->first <<":"; // 输出键
cout<< itor->second << endl; // 输出值
}
}
>>>
222:hexin
666:marsggbo
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP设计模式之单例模式入门与应用详解
- Laravel框架实现定时Task Scheduling例子
- PHP使用 Pear 进行安装和卸载包的方法详解
- Laravel5.1框架注册中间件的三种场景详解
- 浅谈laravel数据库查询返回的数据形式
- PHP设计模式之策略模式(Strategy)入门与应用案例详解
- 基于Python3读写INI配置文件过程解析
- laravel 解决paginate查询多个字段报错的问题
- php判断/计算闰年的方法小结【三种方法】
- Laravel定时任务的每秒执行代码
- PHP学习记录之面向对象(Object-oriented programming,OOP)基础【类、对象、继承等】
- Python通过zookeeper实现分布式服务代码解析
- laravel 实现向公共模板中传值 (view composer)
- PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】
- laravel 解决crontab不执行的问题