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
随机推荐
- Spark SQL 用户自定义函数UDF、用户自定义聚合函数UDAF 教程(Java踩坑教学版)
在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等 UDAF( ...
- 使用curl上传报错问题排查
1. THE STOR COMMAND 说明存储出了问题,处理方案: 方案1: 请检查ftp服务器存储是否已满,若已满则清理一下空间即可. 方案2: 若ftp服务器存储未满,请检查是否有上传了的文件, ...
- angular、vue使用感受
最近开始学习并使用vue.js,并使用vue+node开发了一个移动端APP来练手,下面想聊聊我对于vue的粗浅看法,并将它和angular进行一些对比: 1.vue是一个轻量.高效的前端组件化框架, ...
- 读书笔记 effective c++ Item 23 宁可使用非成员非友元函数函数也不使用成员函数
1. 非成员非友元好还是成员函数好? 想象一个表示web浏览器的类.这样一个类提供了清除下载缓存,清除URL访问历史,从系统中移除所有cookies等接口: class WebBrowser { pu ...
- Linux Bash Shell入门教程
Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...
- UVALive 7045 Last Defence
ProblemK. Last Defence Description Given two integersA and B. Sequence S is defined as follow: • S0 ...
- JAVA学习之动态代理
JDK1.6中的动态代理 在Java中Java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口可以生成一个动态代理对象.JDK提供 ...
- Java面试15|网络
1.TCP(Transmission Control Protocol)三次握手与四次分手 TCP在不可靠的传输信道上提供了可靠传输的抽象,隐藏了我们的应用程序大部分的复杂性功能:丢包重传,按序传送, ...
- JAVA: List用法
1.List中可以添加任何对象,包括自己定义的新的类. class Person{.....}上面定义了一个Person类,下面看好如何使用ListPerson p1=new Person();Per ...
- Troubleshooting OpenStack Bug- 每天5分钟玩转 OpenStack(162)
这是 OpenStack 实施经验分享系列的第 12 篇. 问题描述 客户报告了一个问题:对 instance 执行 migrate 操作,几个小时了一直无法完成,不太正常. 问题分析 遇到这种情况, ...