热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++语法复习笔记9.C++STl、Boost库、多线程编程(进行中)

文章目录1.STL1.概览2.容器2.1.序列式容器vector、list、deque初始化遍历-for_each函数2.2.适配器stack、queue、priority_que


文章目录


  • 1. STL
    • 1. 概览
    • 2. 容器
      • 2.1. 序列式容器vector、list、deque
        • 初始化
        • 遍历-for_each函数

      • 2.2. 适配器stack、queue、priority_queue
        • 初始化
        • 访问方式

      • 2.3. 关联型容器map、set
        • 插入元素
        • 遍历-仿函数
        • 查询-find函数
        • 删除-erase函数
          • 用for循环
          • 用find函数查找删除或直接删除



    • 3. 仿函数
      • 3.1 概念
      • 3.2 排序代码示例
        • C++ 原生函数
        • C++ 泛型编程
        • C++ 仿函数
        • C++ 仿函数模板







慕课网C++教程



1. STL

1. 概览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2. 容器

在这里插入图片描述


2.1. 序列式容器vector、list、deque


初始化

在这里插入图片描述

int iArr[] = { 1, 2,3,4,5 };
vector<int> iVector(iArr, iArr &#43; 4); // 通过地址&#xff0c;初始化vector[1,2,3,4]
list<int> iList(iArr, iArr &#43; 4);
deque<int> iDeque(iArr, iArr &#43; 4);

遍历-for_each函数

在这里插入图片描述

// 显示-重载运算符-函数
struct Display {
void operator()(int i)
{
cout << i << " ";
}
};
int main() {
for_each( iVector.begin(), iVector.end(), Display());
cout << endl;
for_each(iList.begin(), iList.end(), Display());
cout << endl;
for_each(iDeque.begin(), iDeque.end(), Display());
cout << endl;
return 0;
}

在这里插入图片描述


2.2. 适配器stack、queue、priority_queue


初始化

int iArr[] &#61; { 1, 2,3,4,5 };
// 序列式容器
vector<int> iVector(iArr, iArr &#43; 4); // 通过地址&#xff0c;初始化vector[1,2,3,4]
list<int> iList(iArr, iArr &#43; 4);
deque<int> iDeque(iArr, iArr &#43; 4);
// 适配器
queue<int> iQueue(iDeque); // 队列 先进先出
stack<int> iStack(iDeque); // 栈 先进后出
priority_queue<int> iPQueue(iArr, iArr &#43; 4); // 优先队列&#xff0c;按优先权

访问方式

// 遍历适配器
while ( !iQueue.empty() )
{
cout << iQueue.front() << " "; // 1 2 3 4
iQueue.pop();
}
cout << endl;
while (!iStack.empty())
{
cout << iStack.top() << " "; // 4 3 2 1
iStack.pop();
}
cout << endl;
while (!iPQueue.empty())
{
cout << iPQueue.top() << " "; // 4 3 2 1
iPQueue.pop();
}
cout << endl;

2.3. 关联型容器map、set


插入元素

map<string, double> studentSocres;
// 插入元素
// 方式1&#xff1a;像数组一样操作
studentSocres["LiMing"] &#61; 95.0;
studentSocres["LiHong"] &#61; 98.5;
// 方式2&#xff1a;insert方法
studentSocres.insert(pair<string, double>("zhangsan", 100.0) );
studentSocres.insert(pair<string, double>("Lisi", 98.6));
studentSocres.insert(pair<string, double>("wangwu", 94.5));
// 方式3&#xff1a;value_type方法-指明插入数据的类型
studentSocres.insert(map<string, double>::value_type("zhaoliu", 95.5) );

遍历-仿函数

// 仿函数
struct Display
{
void operator()(pair<string, double> info)
{
cout << info.first << ": " << info.second << endl;
}
};
int main() {
for_each(studentSocres.begin(),studentSocres.end(), Display());
cout << endl;
return 0;
}

在这里插入图片描述


查询-find函数

// 查询操作-使用find函数完成查找工作
map<string, double>::iterator iter;
iter &#61; studentSocres.find("zhaoliu");
if (iter !&#61; studentSocres.end())
{
cout << "Found the score is: " << iter->second << endl;
}
else
{
cout << "Didn&#39;t find the key." << endl;
}

删除-erase函数

在这里插入图片描述


  • 注意迭代器失效问题&#xff0c;删除迭代器指针后&#xff0c;迭代器要向下个位置移动一位&#xff0c;继续判断下个位置的key&#xff0c;value
  • 即&#xff0c;先清除临时迭代器中的内容&#xff0c;再将迭代器指向下个位置的内容studentSocres.erase(iter&#43;&#43;);

// 使用迭代器完成遍历查找的过程
iter &#61; studentSocres.begin();
while (iter !&#61; studentSocres.end())
{
if (iter->second < 98.0) // 去除不是优秀的同学
{
studentSocres.erase(iter&#43;&#43;); // 注意&#xff1a;迭代器失效问题
}
else
{
iter&#43;&#43;;
}
}
for_each(studentSocres.begin(), studentSocres.end(), Display());
cout << endl;

在这里插入图片描述


用for循环

// 用for循环进行迭代器的遍历
for (iter &#61; studentSocres.begin(); iter !&#61; studentSocres.end(); iter&#43;&#43;)
{
if (iter->second <&#61; 98.5)
{
// 清除临时迭代器的值&#xff0c;函数返回时会指向下个迭代器&#xff0c;要有指针能够接收
iter &#61; studentSocres.erase(iter);
}
}
for_each(studentSocres.begin(), studentSocres.end(), Display());
cout << endl;

用find函数查找删除或直接删除

// find得到迭代器并删除-避免由于循环导致迭代器失效问题
iter &#61; studentSocres.find("LiHong");
studentSocres.erase(iter);
for_each(studentSocres.begin(), studentSocres.end(), Display());
// 直接删除key
int n &#61; studentSocres.erase("LiHong1");
cout << n << endl;
for_each(studentSocres.begin(), studentSocres.end(), Display());
// 删除范围内的值
studentSocres.erase(studentSocres.begin(), studentSocres.end());
for_each(studentSocres.begin(), studentSocres.end(), Display());
cout << endl;

3. 仿函数


3.1 概念

在这里插入图片描述


3.2 排序代码示例


C&#43;&#43; 原生函数

// 自定义排序函数
bool MySort(int a, int b)
{
return a < b; // a在前&#xff0c;a小&#xff0c;即从小到大排序
}
// 自定义输出函数
void Display(int a)
{
cout << a << " ";
}
int main() {
// C&#43;&#43;方式
int arr[] &#61; { 4, 3, 2, 1, 7 };
sort(arr, arr &#43; 5, MySort); // 起始位置&#xff0c;原生定义函数
for_each(arr, arr &#43; 5, Display);
cout << endl;
return 0;
}

在这里插入图片描述


C&#43;&#43; 泛型编程

// 定义泛型函数
template<class T>
inline bool MySortT(T const& a, T const& b) // 用const& 优化性能
{
return a < b;
}
template<class T>
inline void DisplayT(T const& a)
{
cout << a << " ";
}
int main() {
// C&#43;&#43;泛型
int arr2[] &#61; { 4, 3, 2, 1, 7 };
sort(arr2, arr2 &#43; 5, MySortT<int>);
for_each(arr2, arr2 &#43; 5, DisplayT<int>);
cout << endl;
return 0;
}

C&#43;&#43; 仿函数

// 定义仿函数
struct SortF
{
bool operator() (int a, int b)
{
return a < b;
}
};
struct DisplayF
{
void operator() (int a)
{
cout << a << " ";
}
};
int main() {
// C&#43;&#43;仿函数
int arr3[] &#61; { 4, 3, 2, 1, 7 };
sort(arr3, arr3 &#43; 5, SortF());
for_each(arr3, arr3 &#43; 5, DisplayF());
cout << endl;
return 0;
}

C&#43;&#43; 仿函数模板

// C&#43;&#43;仿函数模板
template<class T>
struct SortTF
{
inline bool operator() (T const& a, T const& b) const
{
return a < b;
}
};
template<class T>
struct DisplayTF
{
inline void operator() (T const& a) const
{
cout << a << " ";
}
};
int main() {
// C&#43;&#43;仿函数模板
int arr4[] &#61; { 4, 3, 2, 1, 7 };
sort(arr4, arr4 &#43; 5, SortTF<int>() );
for_each(arr4, arr4 &#43; 5, DisplayTF<int>());
cout << endl;
return 0;
}






推荐阅读
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文总结了Java程序设计第一周的学习内容,涵盖语言基础、编译解释过程及基本数据类型等核心知识点。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 优化ASM字节码操作:简化类转换与移除冗余指令
    本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 在多线程编程环境中,线程之间共享全局变量可能导致数据竞争和不一致性。为了解决这一问题,Linux提供了线程局部存储(TLS),使每个线程可以拥有独立的变量副本,确保线程间的数据隔离与安全。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
author-avatar
小老虎颖儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有