C++学习笔记之模板篇

简介: 一、模板不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.h文件和.c文件,需要写成一个文件。函数模板关键字:template:用于声明模板typename,class:声明类型,作用相同,不过建议用typename1.

一、模板

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

  • 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

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);
    
    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

目录
相关文章
|
3月前
|
存储 算法 安全
c++模板进阶操作——非类型模板参数、模板的特化以及模板的分离编译
在 C++ 中,仿函数(Functor)是指重载了函数调用运算符()的对象。仿函数可以像普通函数一样被调用,但它们实际上是对象,可以携带状态并具有更多功能。与普通函数相比,仿函数具有更强的灵活性和可扩展性。仿函数通常通过定义一个包含operator()的类来实现。public:// 重载函数调用运算符Add add;// 创建 Add 类的对象// 使用仿函数return 0;
119 0
|
3月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
87 0
|
6月前
|
编译器 C++
模板(C++)
本内容主要讲解了C++中的函数模板与类模板。函数模板是一个与类型无关的函数家族,使用时根据实参类型生成特定版本,其定义可用`typename`或`class`作为关键字。函数模板实例化分为隐式和显式,前者由编译器推导类型,后者手动指定类型。同时,非模板函数优先于同名模板函数调用,且模板函数不支持自动类型转换。类模板则通过在类名后加`&lt;&gt;`指定类型实例化,生成具体类。最后,语录鼓励大家继续努力,技术不断进步!
|
7月前
|
编译器 C++
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
7月前
|
安全 C++
【c++】模板详解(2)
本文深入探讨了C++模板的高级特性,包括非类型模板参数、模板特化和模板分离编译。通过具体代码示例,详细讲解了非类型参数的应用场景及其限制,函数模板和类模板的特化方式,以及分离编译时可能出现的链接错误及解决方案。最后总结了模板的优点如提高代码复用性和类型安全,以及缺点如增加编译时间和代码复杂度。通过本文的学习,读者可以进一步加深对C++模板的理解并灵活应用于实际编程中。
96 0
|
7月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
10月前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
324 4
|
10月前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
127 3
|
11月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
86 1
|
10月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
121 0