IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++实验(四)STL应用 -> 正文阅读

[C++知识库]C++实验(四)STL应用

作者:recommend-item-box type_blog clearfix


一、STL

  • 标准模板库(Standard Template Library,简称STL)定义了一套概念体系,为泛型程序设计提供了逻辑基础
  • STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的。
  • 使用STL的模板时,类型参数既可以是C++标准库中已有的类型,也可以是自定义的类型——只要这些类型是所要求概念的模型。
组件描述
容器(Containers)容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms)算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators)迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

在这里插入图片描述

二、STL应用

2.1 结合容器和迭代器解决序列变换(如取反、平方、立方)

代码:

#include <iostream>
#include <vector>
using namespace std;

// 取反
template<typename T>
class negatation {
public:
	T operator()(T input)
	{
		return -input;
	}
};

// 平方
template<typename T>
class square {
public:
	T operator()(T input)
	{
		return pow(input, 2);
	}
};

// 立方
template<typename T>
class cubic {
public:
	T operator()(T input)
	{
		return pow(input, 3);
	}
};

// 遍历序列并进行相应的操作
template<typename input, class function>
void traverse(input first, input last, ostream& os, function op)
{
	for (; first != last; ++first)
		os << op(*first) << " ";
}

int main() {
	const int N = 5;
	vector<int> s(N);
	for (int i = 0; i < N; i++)
		cin >> s[i];
	cout << "取反:";
	traverse(s.begin(), s.end(), cout, negatation<int>());
	cout << endl;

	cout << "平方:";
	traverse(s.begin(), s.end(), cout, square<int>());
	cout << endl;

	cout << "立方:";
	traverse(s.begin(), s.end(), cout, cubic<int>());
	cout << endl;
	
	return 0;
}

运行结果:
在这里插入图片描述

2.2 结合容器和迭代器解决像素变换(二值化)

代码:

#include <iostream>
#include <vector>
using namespace std;

// 像素变换
template<typename T>
class Pixelate {
public:
	int _value;
	// 阈值默认为128,值小于128则更改为0,否则更改为1
	Pixelate(int value = 128) : _value(value) {}
	T operator()(T input)
	{
		return input < _value ? 0 : 1;
	}
};

// 遍历序列并进行相应的操作
template<typename input, class function>
void traverse(input first, input last, ostream& os, function op)
{
	for (; first != last; ++first)
		os << op(*first) << " ";
}

int main() {
	const int N = 5;
	vector<int> s(N);
	for (int i = 0; i < N; i++)
		cin >> s[i];
	cout << "二值化:";
	traverse(s.begin(), s.end(), cout, Pixelate<int>());
	cout << endl;

	return 0;
}

运行结果:
在这里插入图片描述

2.3 用set存储学生信息,并进行增删改查操作

代码:

#include <iostream>
#include <vector>
#include <set>
using namespace std;

// 遍历
template<typename input>
void traverse(input first, input last, ostream& os)
{
    for (; first != last; ++first)
        os << *first << " ";
}

class student_info {
public:
    string _str_id;
    string _str_name;

    // 构造器
    student_info(string id, string name) {
        _str_id = id;
        _str_name = name;
    }

    //输出符重载
    friend ostream& operator<<(ostream& os, const student_info& stduent)
    {
        os << stduent._str_id << " " << stduent._str_name;
        return os;
    }
    //比较学号大小
    friend bool operator<(const student_info& stduent1, const student_info& stduent2) {
        return stduent1._str_id < stduent2._str_id;
    }
};

int main() {
    vector<student_info> students;
    //将一个学生对象插入动态数组中(增加元素)
    students.push_back(student_info("25048", "Huang Huacong"));
    students.push_back(student_info("25058", "Wang Kailai"));
    students.push_back(student_info("25059", "Li Ao"));
    students.push_back(student_info("25060", "Lei Wenhui"));
    set<student_info> studentSet(students.begin(), students.end());
    cout << "student set的遍历结果为:[";
    traverse(studentSet.begin(), studentSet.end(), cout);
    cout << "]" << endl;

    //删除指定元素
    studentSet.erase(student_info("25059", "Li Ao"));
    cout << "student set(deleted)的遍历结果为:[";
    traverse(studentSet.begin(), studentSet.end(), cout);
    cout << "]" << endl;

    //查询指定学号的学生姓名
    const char* num = "25060";
    set<student_info>::iterator it;
    for (it = studentSet.begin(); it != studentSet.end(); it++)
    {
        if (((*it)._str_id).compare(num) == 0)
            cout << num << "学生姓名为:" << (*it)._str_name << endl;
            
    }
}

运行结果:
在这里插入图片描述

上面代码还缺少修改操作,但由于Set的迭代器iterator有const修饰,因此只能对它进行读取而不能进行修改。

在这里插入图片描述

2.4 使用map统计字符串中每个字符出现的次数

代码:

#include <iostream>
#include<map>
using namespace std;

int main() {
    map<char, int> word_count;
    const char* word = "LiaoNanan";
    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++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:05:10  更:2021-11-28 11:06:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:51:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码