视频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;
}