小甲鱼C++快速入门——第九天

视频44——函数模板

泛型编程技术支持程序员创建函数和类的蓝图(即模板,template),而不是具体的函数和类。

标准模板库STL(Standard Template Library),STL库是泛型编程技术的经典之作,它包含了许多非常有用的数据类型和算法

#include <iostream>
#include <string>

//模板
template <class T>
void swap(T &a, T&b)
{
    T temp = a;
    a = b;
    b = temp;
}

int main()
{
    int i1 = 100;
    int i2 = 200;
    std::cout << "交换前:i1 = " << i1 << ", i2 = " << i2 << "\n\n";

    swap(i1,i2);
    std::cout << "交换后:i1 = " << i1 << ", i2 = " << i2 << "\n\n";

    std::string s1 = "小甲鱼";
    std::string s2 = "小鱿鱼";
    std::cout << "交换前:s1 = " << s1 << ", s2 = " << s2 << "\n\n";

    swap(s1,s2);
    std::cout << "交换后:s1 = " << s1 << ", s2 = " << s2 << "\n\n";

    return 0;
}

注意点

视频45——类模板

#include <iostream>
#include <string>

template<class T>
class Stack
{
public:
    Stack(unsigned int size = 100);
    ~Stack();

    void push(T value);//入栈
    T pop();//出栈

private:
    unsigned int size;//栈的大小
    unsigned int sp;//当前栈的地址
    T *data;//存放数据
};

template<class T>
Stack<T>::Stack(unsigned int size)
{
    this->size = size;
    data = new T[size];
    sp = 0;//默认栈指向栈底
}
template<class T>
Stack<T>::~Stack()
{
    delete []data;//删除数组
}

template<class T>
void Stack<T>::push(T value)
{
    data[sp++] = value;
}
template<class T>
T Stack<T>::pop()
{
    return data[--sp];
}

int main()
{
    Stack<int> intStack(100);

    intStack.push(1);//将1推入栈
    intStack.push(2);
    intStack.push(3);

    std::cout << intStack.pop() << "\n";//弹栈
    std::cout << intStack.pop() << "\n";
    std::cout << intStack.pop() << "\n";

    return 0;
}

视频46——内联模板

内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。编译时类似宏替换,使用函数体替换调用处的函数名。(在程序中,调用其函数时,该函数在编译时被替换,而不是像一般函数那样是在运行时被调用)

#include <iostream>
#include <string>

template<class T>
class Stack
{
public:
    //类中使用内联模板:将定义和声明放在一起
    Stack(unsigned int size)
    {
        this->size = size;
        data = new T[size];
        sp = 0;//默认栈指向栈底
    }
    ~Stack()
    {
        delete []data;//删除数组
    }

    void push(T value)//入栈
    {
        data[sp++] = value;
    }
    T pop()//出栈
    {
        return data[--sp];
    }

private:
    unsigned int size;//栈的大小
    unsigned int sp;//当前栈的地址
    T *data;//存放数据
};


int main()
{
    Stack<int> intStack(100);

    intStack.push(1);//将1推入栈
    intStack.push(2);
    intStack.push(3);

    std::cout << intStack.pop() << "\n";//弹栈
    std::cout << intStack.pop() << "\n";
    std::cout << intStack.pop() << "\n";

    return 0;
}

视频47——容器【存储数据】和算法【处理数据】

 

数组这种数据结构最大的先天不足就是它受限于一个固定的长度。C++标准库提供的向量(vector)类型从根本上解决了数组先天不足的问题(内存固定,如果不用那么多内存编译器也会为其分配),我们用不着对一个向量能容纳多少元素做出限定,因为向量可以动态地随着你往它里面添加元素而无限增大。还可以用它的size()方法查知某给定向量的当前长度(即包含的元素个数);用push_back()方法往它里面添加东西;begin()方法开始数据的位置;end()方法表示最后元素的下一个位置,不是最后元素的位置。

#include<iostream>
#include <string>
#include <vector>//向量

int main()
{
    //定义向量
    std::vector<std::string> names;
    //往容器中存放数据
    names.push_back("小甲鱼");
    names.push_back("小鱿鱼");
    //向量大小访问用其方法size ()
    for(int i = 0; i < names.size(); i++)
    {
        //通过数组形式访问向量
        std::cout << names[i] << "\n";
    }

    return 0;
}

视频48——容器和算法2

迭代器(iterator)是一种功能非常有限,却非常实用的函数,提供一些基本操作符。其是个所谓的智能指针,具有遍历复杂数据结构的能力。

#include<iostream>
#include <string>
#include <vector>//向量

int main()
{
    //定义向量
    std::vector<std::string> names;
    //往容器中存放数据
    names.push_back("小甲鱼");
    names.push_back("小鱿鱼");
    //迭代器;names.begin()开始位置,names.end()表示最后元素的下一个位置
    std::vector<std::string>::iterator iter = names.begin();
    while(iter != names.end())//names.end()表示最后元素的下一个
    {
        //迭代器是智能指针,可以使用*
        std::cout << *iter << "\n";
        ++iter;
    }
    return 0;
}

#include<iostream>
#include <string>
#include <vector>//向量
#include <algorithm>//算法

int main()
{
    //定义向量
    std::vector<std::string> names;
    //往容器中存放数据
    names.push_back("Larry");
    names.push_back("Rola");
    names.push_back("Dingding");
    names.push_back("Laary");
    names.push_back("TAOM");
    names.push_back("jerry");
    //sort()算法按照英文字母排序
    std::sort(names.begin(), names.end());
    //迭代器;names.begin()开始位置,names.end()表示最后元素的下一个位置
    std::vector<std::string>::iterator iter = names.begin();
    while(iter != names.end())//names.end()表示最后元素的下一个
    {
        //迭代器是智能指针,可以使用*
        std::cout << *iter << "\n";
        ++iter;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值