一、模板

不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.h文件和.c文件,需要写成一个文件。

函数模板

关键字:

  • template:用于声明模板
  • typenameclass:声明类型,作用相同,不过建议用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中的字典。使用的关键字是mappair



使用示例:

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

MARSGGBO♥原创





2017-4-6

C++学习笔记之模板篇的更多相关文章

  1. Noah的学习笔记之Python篇:命令行解析

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  2. Noah的学习笔记之Python篇:函数“可变长参数”

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  3. Noah的学习笔记之Python篇:装饰器

    Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang  (http://www.cnblogs.com/noahzn/) ...

  4. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  5. PHP学习笔记之数组篇

    摘要:其实PHP中的数组和JavaScript中的数组很相似,就是一系列键值对的集合.... 转载请注明来源:PHP学习笔记之数组篇   一.如何定义数组:在PHP中创建数组主要有两种方式,下面就让我 ...

  6. c++学习笔记之封装篇(上)

    title: c++学习笔记之封装篇(上) date: 2017-03-12 18:59:01 tags: [c++,c,封装,类] categories: [学习,程序员,c/c++] --- 一. ...

  7. c++学习笔记之继承篇

    title: c++学习笔记之继承篇 date: 2017-03-26 16:36:33 tags: [c++,继承,public,virtual,private,protected] categor ...

  8. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  9. Django学习笔记(进阶篇)

    Django学习笔记(进阶篇):http://www.cnblogs.com/wupeiqi/articles/5246483.html

随机推荐

  1. Brackets 前端编辑器试用

    Brackets编辑器介绍 "一个现代的,开源的,了解网页设计的编辑器"这是官方的宣传语.也就是说它适用于网页开发,包含了许多亮点功能:实时预览(Live Preview).内联编 ...

  2. 【openstack N版】——认证服务keystone

    一. 基础环境 1.1环境介绍 linux-node1(控制节点) #系统版本 [root@linux-node1 ~]# cat /etc/redhat-release CentOS Linux r ...

  3. SQL SERVER 事务日志 解析

    1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行 ...

  4. 安装Apache遇到的一点问题

    很久以前就安装好了Apache(2.2),现在再用时突然出现了问题: 以http://127.0.0.1/exercise/x.php的方式访问文件是正常的,但是要进入phpMyAdmin建表发现不能 ...

  5. 最近新版本的pangolin出现了点问题,我把可用的旧版本上传到了github

    经测试该版本编译没有问题. 下载地址:https://github.com/zzx2GH/Pangolin.git

  6. swiper入门之快速实现轮播--手机端

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 咖啡师之路:第一日一杯Espresso

    代码敲累了.产品要发布了.熬夜啊加班啊. 精神完全不在状态. 咋办--- 咋办--- 咋办---! 来一杯Espresso浓缩咖啡.各位码农,码神们的必备良品! 咖啡每天要2-3杯,不管是速溶还是现磨 ...

  8. Summary Ranges leetcode

    Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...

  9. 队列工厂之RabbitMQ

    本次和大家分享的是RabbitMQ队列的用法,前一篇文章队列工厂之(MSMQ)中在描述的时候已经搭建了简单工厂,因此本章内容是在其之上扩充的子项不再过多讲解工厂的代码了:RabbitMQ应该是现在互联 ...

  10. poj 2892---Tunnel Warfare(线段树单点更新、区间合并)

    题目链接 Description During the War of Resistance Against Japan, tunnel warfare was carried out extensiv ...