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






推荐阅读
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社区 版权所有