热门标签 | 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;
}






推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • C++语言入门:数组的基本知识和应用领域
    本文介绍了C++语言的基本知识和应用领域,包括C++语言与Python语言的区别、C++语言的结构化特点、关键字和控制语句的使用、运算符的种类和表达式的灵活性、各种数据类型的运算以及指针概念的引入。同时,还探讨了C++语言在代码效率方面的优势和与汇编语言的比较。对于想要学习C++语言的初学者来说,本文提供了一个简洁而全面的入门指南。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
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社区 版权所有