一、模板

不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.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. java中读取特殊文件的类型

    java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...

  2. 一个基于注解的orm简单实现(二):实现思路

    先来看一段常见的数据库操作代码: ``` protected User getDataFromDatabase(long id){ String sql = "select firstnam ...

  3. MongoDB【第一篇】安装

    第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. MongoDB 版本 mongodb-linux-x86_64-rhel70-3.4.2 3. 设置 ...

  4. caoz大神力作、互联网从业者必读之书——《你凭什么做好互联网》深入总结

    作者简介:曹政--俞军的关门弟子,CNZZ统计工具的缔造者,前百度商业产品部boss,4399CTO,微信公众号"caoz的梦呓"(yi),文后附上二维码,经常发布各种互联网干货, ...

  5. 【openstack N版】——可视化服务horizon

    一. openstack可视化服务horizon 1.1dashboard介绍 仪表盘依赖于功能核心服务,包括身份,图像服务,计算和网络两种(neutron)或传统网络(nova-neutron)与独 ...

  6. centOS7 mini配置linux服务器(三) 配置防火墙以及IPtables切换

    一.firewall介绍 CentOS 7中防火墙是一个非常的强大的功能,在CentOS 6.5中在iptables防火墙中进行了升级了. 1.官方介绍 The dynamic firewall da ...

  7. Java程序员入门:Java程序员面试失败的5大原因

    1 说得太少 尤其是那些开放式的问题,如"请介绍下你自己"或"请讲一下你曾经解决过的复杂问题".面试官会通过你对这些技术和非技术问题的回答来评估你的激情.他们也 ...

  8. 好公司、行业、领导?应届生应根据什么选offer?

    两个年轻人大学毕业了,一个去了收入更高的大企业工作,一个去了收入较低的小作坊式工厂工作.你们说他们谁的青春时光最能升值呢?表面上看应该是大企业,可是大企业是做马车制造的,小作坊是做汽车的.现在人们都知 ...

  9. html、css、js实现轮播图

    2017-03-13 今天把轮播图的知识1过了一下,写了一个比较简单的轮播图,给大家参考一下. 查看具体的效果点击这个链接 : http://gjhnstxu.me/%E8%BD%AE%E6%92%A ...

  10. 算法模板——Tarjan强连通分量

    功能:输入一个N个点,M条单向边的有向图,求出此图全部的强连通分量 原理:tarjan算法(百度百科传送门),大致思想是时间戳与最近可追溯点 这个玩意不仅仅是求强连通分量那么简单,而且对于一个有环的有 ...