C++基础总结(六):C++进阶——模板和STL入门
今天小编分享 C++ 模板和STL入门 ,建议大家收藏慢慢学习,同时希望对大家的C++学习有所帮助。
C++ 模板
模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector <int> 或 vector <string>。
您可以使用模板来定义函数和类,接下来让我们一起来看看如何使用。
函数模板
模板函数定义的一般形式如下所示:
template<class type> ret - type func - name ( parameter list ) { // 函数的主体 }
在这里,type 是函数所使用的数据类型的占位符名称。这个名称可以在函数定义中使用。
下面是函数模板的实例,返回两个数中的最大值:
实例
#include<iostream>#include<string>using namespace std;
template<type name T>inline T const & Max ( T const & a,T const & b) {
return a<b?b:a;} int main(){
int i=39;
int j=20;
cout<<"Max(i, j): "<<Max(i,j)<<endl;
double f1=13.5;
double f2=20.7;
cout<<"Max(f1, f2): "<<Max(f1,f2)<<endl;
string s1="Hello";
string s2="World";
cout<<"Max(s1, s2): "<<Max(s1,s2)<<endl;
return0;}
当上面的代码被编译和执行时,它会产生下列结果:
Max(i,j):39 Max (f1,f2):20.7 Max( s1,s2):World类模板
正如我们定义函数模板一样,我们也可以定义类模板。泛型类声明的一般形式如下所示:
template<class type>class class-name{...}
在这里,type 是占位符类型名称,可以在类被实例化的时候进行指定。您可以使用一个逗号分隔的列表来定义多个泛型数据类型。
下面的实例定义了类 Stack<>,并实现了泛型方法来对元素进行入栈出栈操作:
实例
#include<iostream>#include<vector>#include<cstdlib>#include<string>#include<stdexcept>using namespace std;
template<classT>classStack{
private:
vector<T>elems;
// 元素
public:
void push(T const&);
// 入栈
void pop();
// 出栈
T top() const;
// 返回栈顶元素
bool empty() const{
// 如果为空则返回真。
return elems.empty();
} };
template <class T>void Stack<T>::push (T const& elem) {
// 追加传入元素的副本
elems.push_back(elem);
}
template <class T>void Stack<T>::pop () {
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
}
// 删除最后一个元素
elems.pop_back();
} template <class T>T Stack<T>::top () const {
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
}
// 返回最后一个元素的副本
return elems.back();
} int main() {
try {
Stack<int> int
Stack; // int 类型的栈
Stack<string> string Stack;
// string 类型的栈
// 操作 int 类型的栈
int Stack.push(7);
cout << int Stack.top() <<endl;
// 操作 string 类型的栈
string Stack.push("hello");
cout << string Stack.top() << std::endl;
string Stack.pop();
string Stack.pop();
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
} }
当上面的代码被编译和执行时,它会产生下列结果:
7 hello Exception:Stack<>::pop():empty stack
C++ STL 入门
上面我们已经了解了 C++ 模板的概念。C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
C++ 标准模板库的核心包括以下三个组件:
组件
这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。
下面的程序演示了向量容器(一个 C++ 标准的模板),它与数组十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求:
实例
#include<iostream>#include<vector>using namespace std;int main(){
// 创建一个向量存储 int
vector<int> vec;
int i;
// 显示 vec 的原始大小
cout << "vector size = " << vec.size() << endl;
// 推入 5 个值到向量中
for(i = 0; i < 5; i++){
vec.push_back(i);
}
// 显示 vec 扩展后的大小
cout << "extended vector size = " << vec.size() << endl;
// 访问向量中的 5 个值
for(i = 0; i < 5; i++){
cout << "value of vec [" << i << "] = " << vec[i] << endl;
}
// 使用迭代器 iterator 访问值
vector<int>::iterator v = vec.begin();
while( v != vec.end()) {
cout << "value of v = " << *v << endl;
v++;
}
return 0;}
当上面的代码被编译和执行时,它会产生下列结果:
vector size=0extended vector size=5value of vec[0]=0value of vec[1]=1value of vec[2]=2value of vec[3]=3value of vec[4]=4value of v=0value of v=1value of v=2value of v=3value of v=4
关于上面实例中所使用的各种函数,有几点要注意:
push_back( ) 成员函数在向量的末尾插入值,如果有必要会扩展向量的大小。
size( ) 函数显示向量的大小。
begin( ) 函数返回一个指向向量开头的迭代器。
end( ) 函数返回一个指向向量末尾的迭代器。
好了,以上就是对 C++模板和STL入门的分享。
如果你喜欢这篇文章的话,动动小指,加个关注哦~
如果你也想成为程序员,想要快速掌握编程,这里为你分享一个学习企鹅圈子!
里面有资深专业软件开发工程师,在线解答你的所有疑惑~C++入门“so easy”
编程学习书籍:
编程学习视频: