目录
3.1输入一个字符串,用map统计每个字符出现的次数并输出字符及对应的次数
1.什么是STL
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
1.1 STL特点:(1)数据结构和算法的分离,例如:由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;(2)不是面向对象的,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。在STL中找不到任何明显的类继承关系,这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;
2.STL内容
STL中六大组件:
- 容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
- 迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
- 算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
- 仿函数(Functor
- )
- 适配器(Adaptor)
- 分配器(allocator)
2.1 容器
STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。
(1)序列式容器(Sequence containers),每个元素都有固定位置--取决于插入时机和地点,和元素值无关,vector、deque、list;
Vectors:将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;
Deques:是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;
Lists:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;
(2)关联式容器(Associated containers),元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap;
Sets/Multisets:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
Maps/Multimaps:Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现,便于查找;
容器类自动申请和释放内存,无需new和delete操作。vector基于模板实现,需包含头文件vector
2.2 迭代器
Iterator(迭代器)Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照一定顺序(由iterator提供的方法)访问聚合对象中的各个元素。
迭代器的作用:能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来,重载了*,++,==,!=,=运算符。用以操作复杂的数据结构,容器提供迭代器,算法使用迭代器;常见的一些迭代器类型:iterator、const_iterator、reverse_iterator和const_reverse_iterator
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(3); //数组尾部插入3
v.push_back(2);
v.push_back(1);
v.push_back(0);
cout << " 下标 " << v[3] << endl;
cout << " 迭代器 " << endl;
for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
{
cout << *i << " ";
}
cout << endl;
//在第一个元素之前插入111 insert begin+n是在第n个元素之前插入
v.insert(v.begin(), 111);
//在最后一个元素之后插入222 insert end + n 是在n个元素之后插入
v.insert(v.end(), 222);
for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
{
cout << *i << " ";
}
cout << endl;
vector<int> arr(10);
for (int i = 0; i < 10; i++)
{
arr[i] = i;
}
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
{
cout << *i << " ";
}
cout << endl;
//删除 同insert
arr.erase(arr.begin());
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
{
cout << *i << " ";
}
cout << endl;
arr.erase(arr.begin(), arr.begin() + 5);
for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
{
cout << *i << " ";
}
cout << endl;
return 0;
}
运行结果:
3.实验
3.1输入一个字符串,用map统计每个字符出现的次数并输出字符及对应的次数
#include<iostream>
#include<map>
using namespace std;
//输入一个字符串,用map统计每个字符出现的次数并输出字符及对应的次数
void countStr(string str) {
map<char, int> count;
for (int i = 0; i < str.length(); i++) {
// 如果第一次出现就赋值为1
if (count.find(str[i]) == count.end()) {
count[str[i]] = 1;
}
// 否则++
else { count[str[i]]++; }
}
// 打印每个单词出现的次数
for (auto i : count) {
cout << i.first << ": " << i.second << " ";
}
}
int main()
{
countStr("hciuhcasckhqwduwbxlalkasxmdjhcm");
return 0;
}
结果:
3.2 像素变换(二值化、灰度拉伸)
//伽马变换
void gammaTranfer(Mat& gray) {
//gamma值,随着值不同图片呈现出不同的效果
double gamma = 0.01;
Mat grayImg;
gray.convertTo(grayImg, CV_64F, 1.0 / 255, 0);
Mat gammaImg;
pow(grayImg, gamma, gammaImg);
gammaImg.convertTo(gammaImg, CV_8U, 255, 0);
imshow("gammapicture", gammaImg);
}
///二值化变换
void Threshold(Mat& gray) {
Mat result;
threshold(gray, result, 120, 255, THRESH_BINARY);
namedWindow("binary picture");
imshow("binary picture", result);
}
结果:
原始图像:
gamma灰度变换:
二值变换:
参考博客:C++中STL用法总结_满城风絮-CSDN博客_stl