C++ STL详解(3)

点击蓝字

69c679fe3ddc430a4715a22fdbc48387.png

关注我们

简介

  set 是 关联容器 的一种,是排序好的集合(元素已经进行了排序)。set 和 multiset 类似,它和 multiset 的差别在于 set 中不能有重复的元素。multiset 的成员函数 set 中也都有。使用 set 必须包含 #include<set> 头文件。

  在 set 中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。如果插入重复的元素,那么 set 将自动忽略该操作。set 中数元素的值不能直接被改变。C++ STL中标准关联容器 set, multiset, map, multimap 内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树。这四种容器插入、查找、删除的时间复杂度都为 O

map 和 set 的插入删除效率比用其他序列容器高,因为对于关联容器来说,不需要做内存拷贝和内存移动。set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点。

insert()

 向容器中插入一个元素。

#include<iostream>
#include<set>using namespace std;int main() {set<int> s;s.insert(3);s.insert(2);s.insert(1);// 使用迭代器遍历 set for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';//输出结果:1 2 3 return 0;
}

size()

 返回容器中元素的个数。

#include<iostream>
#include<set>using namespace std;int main() {set<int> s;s.insert(3);s.insert(2);s.insert(1);cout << "元素的个数为:" << s.size() << endl; // 使用迭代器遍历 set for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';//输出结果:1 2 3 return 0;
}

empty()

 判断当前容器是否为空,如果为空,返回true;否则返回false。

clear()

 清除当前容器中的所有元素。

#include<iostream>
#include<set>using namespace std;int main() {set<int> s;s.insert(3);s.insert(2);s.insert(1);cout << "元素的个数为:" << s.size() << endl; // 输出结果:元素的个数为:3 // 清空容器中的所有元素 s.clear();cout << "元素的个数为:" << s.size() << endl; // 输出结果:元素的个数为:0return 0;
}

count()

 返回容器中某个值元素的个数。在 set 中返回的值只能是 0 或 1。而在 multiset 中返回的个数可能有多个。下面以 multiset 来进行举例:

#include<iostream>
#include<set>using namespace std;int main() {multiset<int> s;s.insert(6);s.insert(6);s.insert(6);cout << "元素 6 的个数为:" << s.count(6) << endl; // 输出结果:元素 6 的个数为:3 return 0;
}

begin() / end()

 begin() 返回指向第一个元素的迭代器。end() 返回指向最后一个元素之后一个元素的迭代器。这两个都支持 ++ 和 -- 操作, 返回前驱和后继。

 迭代器是 STL 中的重要概念,类似于指针。在这里迭代器的表示为 set<int>::iterator。在C++ 11 中可以使用 auto 关键字来代替 set<int>::iterator。auto 可以自动匹配类型,当变量名称比较长时可以使用 auto 来进行代替。比如 int、double、long long等都可以直接写成 auto 来进行代替。

#include<iostream>
#include<set>using namespace std;int main() {multiset<int> s;s.insert(3);s.insert(2);s.insert(1);// 遍历方式 1: for (set<int>::iterator it = s.begin(); it != s.end(); it++) cout << *it << ' '; // 输出结果:1 2 3cout << endl; for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';// 与上面的输出结果是一样的 cout << endl;// 遍历方式 2: 使用范围遍历 for (auto x : s) cout << x << ' '; // 输出结果:1 2 3return 0;
}

erase()

 删除等于key值的所有元素(返回被删除的元素的个数)。

#include<iostream>
#include<set>using namespace std;int main() {multiset<int> s;s.insert(3);s.insert(2);s.insert(1);s.insert(3);s.insert(3);s.insert(3);for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';// 输出结果:1 2 3 3 3 3cout << endl; cout << s.erase(3);// 输出结果:4cout << endl;for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';// 输出结果:1 2return 0;
}

lower_bound()

 返回指向 大于(或等于) 某值的第一个元素的 迭代器。返回类型类似一个指针,可以使用 * 进行解引用,输出其值。如果不存在则返回迭代器 .end()。

#include<iostream>
#include<set>using namespace std;int main() {multiset<int> s;for (int i = 1; i <= 10; i++) s.insert(i);for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';// 输出结果:1 2 3 4 5 6 7 8 9 10cout << endl;auto it = s.lower_bound(6);cout << *it << endl;// 输出结果:6 it = s.lower_bound(15);cout << *it; // 因为容器中没有 15,所以返回迭代器.end()。输出最后一个元素 10return 0;
}

upper_bound()

 返回 大于某个值 元素的迭代器。注意:该方法与 lower_bound() 方法类似,只是返回的是大于某个元素的迭代器,而不是大于或等于某个元素的迭代器。

#include<iostream>
#include<set>using namespace std;int main() {multiset<int> s;for (int i = 1; i <= 10; i++) s.insert(i);for (auto it = s.begin(); it != s.end(); it++) cout << *it << ' ';// 输出结果:1 2 3 4 5 6 7 8 9 10cout << endl;auto it = s.upper_bound(6);cout << *it << endl;// 输出结果:7 it = s.upper_bound(15);cout << *it; // 因为容器中没有 15,所以返回迭代器.end()。输出最后一个元素 10return 0;
}

max_size()

 返回当前集合能容纳元素的最大限值。

#include<iostream>
#include<set>using namespace std;int main() {set<int> s;cout << s.max_size();// 输出结果:461168601842738790return 0;
}

find()

 返回指向键等于 key 的元素的迭代器。若找不到这种元素,则返回尾后(见 end() )迭代器。

#include<iostream>
#include<set>using namespace std;int main() {multiset<int> s;s.insert(3);s.insert(2);s.insert(1);auto x = s.find(0);if (x != s.end()) cout << "s 中有 0 元素";else cout << "Not found!"; // 输出结果:Not found!return 0;
}

map / multimap

简介

  map 和 multimap 将 key/value pair(键值/实值 队组)当作元素进行管理,根据 key 的排序准则将元素排序。multimap 允许重复元素,map则不允许。容器中元素默认按升序排序。map 和 mutilmap 容器的模板定义在 #include<map> 头文件中。基于 红黑树 实现。

insert()

 向容器中插入一个元素,插入的元素是一个 pair。

#include<iostream>
#include<map>using namespace std;int main() {map<string, int> people;people.insert({"Chen", 24});people.insert({"Zhang", 23});for (auto p : people) cout << p.first << ":" << p.second << endl;return 0;
}

operator[]

 使用 [] 可以返回到映射到等于 key 的关键的值的引用,若这种关键不存在则进行插入。通常使用这种方法进行插入。[] 里面的值为 pair 的第一个值。时间复杂度为 O(logn)

#include<iostream>
#include<map>using namespace std;int main() {map<string, int> people;people["Chen"] = 24;cout << people["Chen"] << endl;// 输出结果:24 cout << people["Zhang"] << endl;for (auto p : people) cout << p.first << ":" << p.second << endl;/* 输出结果:0Chen:24Zhang:0 */ return 0;
}

size()

 返回容器中元素的个数。

empty()

 判断当前容器是否为空,如果为空,返回true;否则返回false。

clear()

 从容器擦除所有元素。此调用后 size() 返回零。

count()

 返回拥有关键比较等价于指定参数的元素数,即返回拥有关键 key 的元素数。因为 map 容器不允许重复故为 1 或 0。而 multimap 返回的个数可能有多个.

begin() / end()

 begin() 返回指向第一个元素的迭代器。end() 返回指向最后一个元素之后一个元素的迭代器。这两个都支持 ++ 和 -- 操作, 返回前驱和后继。访问容器里面的元素可以使用迭代器访问,也可以使用范围访问。

#include<iostream>
#include<map>using namespace std;int main() {map<string, int> people;people["Chen"] = 24;// 访问键为 Chen 的元素,如果有则返回其值,如果没有则添加 cout << people["Chen"] << endl;// 输出结果:24 cout << people["Zhang"] << endl;// 1. 使用范围遍历 for (auto p : people) cout << p.first << ":" << p.second << endl;/* 输出结果:0Chen:24Zhang:0 */cout << endl;// 2. 使用迭代器遍历 for (map<string, int>::iterator p = people.begin(); p != people.end(); p++) {cout << p -> first << ":" << p -> second << endl;// 注意:使用迭代器访问返回的是一个指针,所以要使用 -> 访问符来访问 } // 输出结果与上面的一样 return 0;
}

erase()

 从容器移除指定的元素。一般用法是移除关键等于 key 的元素。

#include<iostream>
#include<map>using namespace std;int main() {map<string, int> people;people["ZhangSan"] = 21;people["LiSi"] = 24;people["WangWu"] = 23;for (auto p : people) cout << p.first << ":" << p.second << endl;/* 输出结果:LiSi:24WangWu:23ZhangSan:21*/puts(""); // 删除键为 LiSi 的元素 people.erase("LiSi");for (auto p : people) cout << p.first << ":" << p.second << endl;/* 输出结果:WangWu:23ZhangSan:21*/return 0;
}

lower_bound() / upper_bound()

 用法与 set 一样,按照 键值 进行返回。

find()

返回指向  等于 key 的元素的迭代器。若找不到这种元素,则返回尾后(见 end() )迭代器。

#include<iostream>
#include<map>using namespace std;int main() {map<string, int> people;people["ZhangSan"] = 21;people["LiSi"] = 24;people["WangWu"] = 23;auto p = people.find("ZhangSan");if (p != people.end()) cout << p -> first << ":" << p -> second;else cout << "Not found!";return 0;
}

未完待续~~~~

344c8d0763cbdc5a5385b8c02691e379.gif

如果你年满18周岁以上,又觉得学【C语言】太难?想尝试其他编程语言,那么我推荐你学Python,现有价值499元Python零基础课程限时免费领取,限10个名额!
▲扫描二维码-免费领取

29d034cb34040d8e0e03b30f71928eca.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【lua学习】8.协程

1 数据结构和宏1.1 协程的状态码1.2 协程的执行状态码1.3 lua_State 协程结构体2 C API2.1 lua_newthread 新建一个协程&#xff0c;压栈&#xff0c;返回这个新协程2.2 luaE_freethread 释放一个协程L12.3 lua_status 获取协程的错误码2.4 lua_resume 唤醒一个协程&#xff0c…

检测到基于堆栈的缓冲区溢出_检测到堆栈粉碎

检测到基于堆栈的缓冲区溢出我敢打赌&#xff0c;每个Java开发人员在他们的职业生涯开始时第一次遇到Java代码的本机方法时都会感到惊讶。 我还可以肯定&#xff0c;多年来随着了解JVM如何通过JNI处理对本机实现的调用而使惊奇消失了。 这篇文章是关于本机方法的最新经验。 更…

探讨 C++ 虚函数 virtual

点击蓝字关注我们来源于网络&#xff0c;侵删有无虚函数的对比C 中的虚函数用于解决动态多态问题&#xff0c;虚函数的作用是允许在派生类中重新定义与积累同名的函数&#xff0c;并且可以通过基类指针或引用来访问基类和派生类中的同名函数。首先写两个简单的类&#xff0c;类…

python上一行的代码打错了怎么办_写Python代码过程中碰到各种错误异常要怎么样去处理?...

错误异常即便Python程序的语法是正确的&#xff0c;在程序运行的过程中&#xff0c;也可能发生错误。运行期检测到的错误被称为异常。如果发生了错误&#xff0c;可以事先约定返回一个错误代码&#xff0c;这样&#xff0c;就可以知道是否有错&#xff0c;以及出错的原因。所以…

双重for_测试双重图案

双重for前段时间&#xff0c;我写了一篇有关使用Test Double的后果的文章&#xff0c;但是与Test Double Patterns无关&#xff0c;仅是一个简单的清单。 今天&#xff0c;我想对其进行更改&#xff0c;并解释这些模式之间的差异。 正如我在提到的文章中写道&#xff1a; Tes…

C++ STL详解(4)

点击蓝字关注我们来源于网络&#xff0c;侵删unordered_set / unordered_multiset这两个容器的方法与上一篇 C STL简介&#xff08;3&#xff09; 提到的 set / multiset 基本一样。但是要注意的是&#xff1a;这两个是无序的&#xff0c;基于哈希表实现的&#xff0c;增删改查…

js压缩图片_Web 性能优化: 图片优化让网站大小减少 62%

图像是web上提供的最基本的内容类型之一。他们说一张图片胜过千言万语。但是如果你不小心的话&#xff0c;图片大小有时高达几十兆。因此&#xff0c;虽然网络图像需要清晰明快&#xff0c;但它们尺寸可以缩小压缩的&#xff0c;使用加载时间保持在可接受的水平。在我的网站上&…

春春幼儿园堆积木大赛_春云边车

春春幼儿园堆积木大赛我有一个部署到基于NetflixOSS的云的应用程序&#xff0c;该应用程序具有以下结构&#xff1a; 本质上是一种将信息持久保存到Cassandra集群的服务。 所有应用程序都已注册到Eureka –因此&#xff0c;在本例中&#xff0c;该服务以及Cassandra节点都已在…

C++ 标准输入的行加速

点击蓝字关注我们来源于网络&#xff0c;侵删一、前言c/c 的标准输入函数&#xff0c;在输入一行数据&#xff0c;当数据量比较大的时候&#xff0c; cin 的效率是非常低的&#xff0c;为了加快读入的效率&#xff0c;可以改用 scanf&#xff0c;当然&#xff0c;还有一种利用 …

如何用python 开发web_如何用python开发web

Django是一个Web框架——一套用于帮助开发交互式网站的工具。Django能够响应网页请求&#xff0c;还能让你更轻松地读写数据库、管理用户等。建立Django项目建立Django项目首先需要确保我们按照好了Django&#xff0c;我们在Pycharm中打开虚拟环境的终端&#xff0c;然后输入&a…

redis安装_Redis安装

redis安装本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成课程。 您将学习如何安装Redis和启动服务器。 此外&#xff0c;您还会在Redis命令行上乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c…

C++ 自动锁

点击蓝字关注我们来源于网络&#xff0c;侵删一、锁1.锁 是 多线程编程 中一个很常用的概念&#xff0c;这里不多加介绍其原理&#xff0c;有兴趣可以参考 临界区 进行更多的了解&#xff1b;2.锁 一般会提供三个接口&#xff1a;加锁&#xff08;Lock&#xff09;、解锁&#…

python快速编程入门黑马程序员pdf_Python快速编程入门 传智播客 黑马程序员 python编程从入门到实践基础视频教程核心编程爬虫数据分析程序设计机器学习简明书籍...

传智播客就业系列从入门到就业JAVA从入门到精通 套装5本&#xffe5;148javaweb从入门到精通套装3本&#xffe5;88Python从入门到实践套装8本&#xffe5;280php教程全套7本&#xffe5;227PHP套装5本&#xffe5;165php全套5本&#xffe5;149android开发从入门到精通 共3本&…

叉叉框架_叉/连接框架

叉叉框架本文是我们名为Java Concurrency Essentials的学院课程的一部分。 在本课程中&#xff0c;您将深入探讨并发的魔力。 将向您介绍并发和并发代码的基础知识&#xff0c;并学习诸如原子性&#xff0c;同步和线程安全性的概念。 在这里查看 &#xff01; 目录 1.简介 2…

C++ 浮点数精度判定

点击蓝字关注我们来源于网络&#xff0c;侵删一、引例看下下面这段代码&#xff0c;会输出什么结果呢&#xff1f;double x 0;for (int i 0; i < 10; i) {x 0.1;}printf("%d\n", x 1);输出如下&#xff1a;0引起这种反差的原因就是浮点误差&#xff0c;浮点数…

字节流和字符流哪个不刷新_不喜欢节流吗?

字节流和字符流哪个不刷新您别无选择–底层系统&#xff08;此处的JVM将为您完成选择&#xff09;。 我仍然记得2013年夏天&#xff0c;当时我正在运行一个项目&#xff0c;整个应用程序中只有1个URL使服务器瘫痪。 问题很简单-机器人决定以很高的速率索引我们的网站&#xff…

C/C++动态内存管理—(new与malloc)

点击蓝字关注我们来源于网络&#xff0c;侵删1.C/C内存分布虚拟地址空间分布&#xff1a;由C/C编译的程序占用的内存分为以下几个部分&#xff1a;栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放为运行函数而分配的局部变量、函数参数、返回数据、…

python实现简单小游戏_python实现简单井字棋小游戏

#Tic-Tac-Toe 井字棋游戏#全局常量X"X"O"O"EMPTY" "#询问是否继续def ask_yes_no(question):responseNone;while response not in("y","n"):responseinput(question).lower()return response#输入位置数字def ask_number(qu…

C++ sort()排序详解

点击蓝字关注我们来源自网络&#xff0c;侵删一.sort()简介1.为什么选择使用sort()我们经常会碰到排序的问题&#xff0c;如果我们不使用一些排序的方法那我们只能手撕排序&#xff0c;这样就会浪费一些时间。而且我们还需要根据需要去选择相关的排序方法&#xff1a;冒泡排序、…

java尾行注释有什么不好_注释不好吗?

java尾行注释有什么不好那天&#xff0c;我在有关Spring XML与注释的文章中运用了自己的原则&#xff0c;轻松进入了这个主题。 对于目前正在编写此新应用程序的团队来说&#xff0c;这种简单的输入方式也是我不使事情复杂化的方式&#xff0c;该应用程序的生产寿命可能为3-5年…