一 STL简介
C++STL就是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈等。
C++ 标准模板库的核心包括以下三个组件:
1. 容器(Containers)
容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。不同的容器基于不同的数据结构
2.算法(Algorithms)
算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。以此同时,多亏了C++Templet,算法的实现也独立于容器。
3.迭代器(iterators)
迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
二 容器和迭代器
1 序列变换(取反、平方、立方)
代码实现:
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
#include <functional>
#include <set>
using namespace std;
//取反
template<typename T>
T InvT(T a)
{
return -a;
}
template<typename T>
//平方
T SqrT(T a)
{
return a * a;
}
//立方
template<typename T>
T CubeT(T a)
{
return a * a * a;
}
//自定义操作运算函数
template<typename inputIter, typename outputIter, typename MyOperator>
void transCalcT(inputIter begInput, inputIter endInput, outputIter begOutput, MyOperator op)
{
for (; begInput != endInput; begInput++, begOutput++)
{
*begOutput = op(*begInput);
}
}
template < typename T>
void outputCont(string strNme, ostream& os, T begin, T end)
{
os << strNme + "的遍历结果为:[";
for (; begin != end; begin++)
{
os << *begin << " ";
}
os << "]" << endl;
}
int main(int argc, char** argv) {
const int N = 5;
int a[N] = { 1,2,3,4,5 };
int b[N];
//设置一个容量为5的容器vb,数据类型为double
vector<double> vb(N);
transCalcT(a, a + N, vb.begin(), InvT<int>);
outputCont("原数组", cout,a, a+N);
outputCont("取反的结果", cout, vb.begin(), vb.end());
transCalcT(a, a + N, vb.begin(), SqrT<int>);
outputCont("平方的结果", cout, vb.begin(), vb.end());
transCalcT(a, a + N, vb.begin(), CubeT<int>);
outputCont("立方的结果", cout, vb.begin(), vb.end());
}
运行结果:
2 像素变换(二值化、灰度拉伸)
代码实现:
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
#include <functional>
#include <set>
using namespace std;
// 二值化
template<typename T>
class MyThreshold {
public:
MyThreshold(int n = 128) :_nThreshold(n) {}
int operator()(T val)
{
//在二值化过程中,对每一个像元进行二值化处理,若小于_nThreshold,则置为0,反之则置为1
return val < _nThreshold ? 0 : 1;
}
int _nThreshold;
};
//灰度变换
template <typename T>
class Mytrans
{
public:
Mytrans(int n = 128) :c(n) {}
int operator()(T val)
{
//将每一个像元大小增加10
return val += 10;
}
int c;
};
//自定义操作运算函数
template<typename inputIter, typename outputIter, typename MyOperator>
void transCalcT(inputIter begInput, inputIter endInput, outputIter begOutput, MyOperator op)
{
for (; begInput != endInput; begInput++, begOutput++)
{
*begOutput = op(*begInput);
}
}
template < typename T>
void outputCont(string strNme, ostream& os, T begin, T end)
{
os << strNme + "的遍历结果为:[";
for (; begin != end; begin++)
{
os << *begin << " ";
}
os << "]" << endl;
}
int main(int argc, char** argv) {
const int N = 5;
int a[N] = { 120,121,128,129,130 };
int b[N];
//设置一个容量为5的容器vb,数据类型为double
vector<double> vb(N);
transCalcT(a, a + N, vb.begin(), MyThreshold<int>());
outputCont("二值化", cout, vb.begin(), vb.end());
transCalcT(a, a + N, vb.begin(), Mytrans<int>());
outputCont("灰度变换", cout, vb.begin(), vb.end());
}
运行结果:
二 Set应用
class Student {
public:
//两个参数的构造函数
Student(string strName, int strNo) {
_strNo = strNo;
_strName = strName;
}
int _strNo;
string _strName;
//输出符重载
friend ostream& operator<<(ostream& os, const Student& info)
{
os << info._strNo << " " << info._strName;
return os;
}
//比较学号大小
friend bool operator<(const Student& info1, const Student& info2) {
return info1._strNo < info2._strNo;
}
};
template < typename T>
void outputCont(string strNme, ostream& os, T begin, T end)
{
os << strNme + "的遍历结果为:[";
for (; begin != end; begin++)
{
os << *begin << " ";
}
os << "]" << endl;
}
void TestSet()
{
//自定义数据类型,都会制定排序规则
set<Student>s;
//创建学生信息
Student s1("小米",20);
Student s2("小明",30);
Student s3("小兰",40);
Student s4("小陈",50);
//增加
s.insert(s1);
s.insert(s2);
s.insert(s3);
s.insert(s4);
outputCont("增加后的student", cout, s.begin(), s.end());
//查询
set<Student>::iterator it;
cout << "大于35岁的人:";
for (it = s.begin(); it != s.end(); it++)
{
if (((*it)._strNo)>35)
cout << (*it) << " ";
}
cout << endl;
//删除
s.erase(Student("小米", 20));
outputCont("删除后的student", cout,s.begin(), s.end());
}
运行结果
三 map应用
void TestMap()
{
//定于map类型
map<char, int> word_count;
const char* word = "foadijoiadsjfoijcxiovjoiqjweoisssss";
for (int i = 0; i < strlen(word); i++)
{
word_count[word[i]]++;
}
map<char, int>::iterator iter;
for (iter = word_count.begin(); iter != word_count.end(); iter++)
{
cout << "[" << iter->first << "] = " << iter->second << endl;
}
}
运行结果:
四 总结
c++的stl库可以大大提高我们开发的效率,学会使用这类库是我们开发中不可或缺的技能,它会是我们开发解决问题的利刃。