C++学习笔记之模板篇
一、模板
不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.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
C++学习笔记之模板篇的更多相关文章
- Noah的学习笔记之Python篇:命令行解析
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:函数“可变长参数”
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- PHP学习笔记之数组篇
摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇 一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...
- c++学习笔记之封装篇(上)
title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...
- c++学习笔记之继承篇
title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...
- OpenCV 学习笔记(模板匹配)
OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...
- Django学习笔记(进阶篇)
Django学习笔记(进阶篇):http://www.cnblogs.com/wupeiqi/articles/5246483.html
随机推荐
- Android学习20--OpenGL的"mapPoints"
在OpenGL中有时会需要求一个3维空间中的点在平移(缩放,旋转)后坐标是多少.需求相当于二维的mapPoints.可以通过这个函数实现 void multiplyMV (float[] result ...
- JavaScript定时器及相关面试题
在单线程JavaScript这篇文章中,在介绍JavaScript单线程的同时,也介绍了setTimeout是如何工作的.但是对于定时器的一些内容,并没有做深入的讨论.这篇文章,会详细说说JS的两种定 ...
- AR入门系列-在vuforia官网的使用-01-史上最详细AR入门教程
使用高通的vuforiaSDK 网址:https://developer.vuforia.com/ 我们想要使用vuforia首先得注册一个账号 网站会发送邮件给你的邮箱 点击验证链接,验证邮箱 出现 ...
- Spring框架---Spring入门
Spring入门 为了能更好的理解先讲一些有的没的的东西: 什么是Spring Spring是分层的JavaSE/EE full-stack(一站式) 轻量级开源框架 分层 SUN提供的EE的三层结构 ...
- ceph-deploy install时,远端节点在执行apt-get update命令时失败
环境 OS:Ubuntu 16.04 背景 使用ceph-deploy部署Ceph集群,调用ceph-deploy install命令在远端节点安装ceph环境,执行apt-get update命令时 ...
- 启动phpstyle Apache的80端口被win7的System PID=4的进程占用的解决方法
学习前端是,用到Ajax,php语言,操作mysql数据库,浏览器无法解析php代码(把源码输出):原因,我之前用的是tomcat服务器写jsp,servlet,php用的是apache服务器,没有配 ...
- Python--校园网爬虫记
查成绩,算分数,每年的综合测评都是个固定的过程,作为软件开发者,这些过程当然可以交给代码去做,通过脚本进行网络请求获取数据,然后直接进行计算得到基础分直接填表就好了,查成绩再手动计算既容易出错也繁琐, ...
- 通过代码在eclips中添加Maven Dependencies依赖包的简单方法
条件是已经正确解压了maven包并配置好了环境变量: 然后新建一个maven项目,(可在other中找到) 然后打开最下边的配置文件pom.xml: 打开后在文本下边选项选pom.xml选项: 在&l ...
- iOS最好用的弹出框
重构项目时发现有的时候需要弹出提示,比如登录成功,数据请求失败,还有选择相机或者相册来上传头像等等. 今天就自己写了一个弹出框,采用的是系统的UIAlertController,只不过自己有定义了一些 ...
- Dollar Dayz poj3181
http://poj.org/problem?id=3181 这个题目一开始就能看出来是个dp问题,但是我并没有一开始就看出来是一个完全背包为题,只是想着根据以前的方法,这个问题应该是可以找到规律的, ...