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,一经查实,立即删除!

相关文章

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

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

探讨 C++ 虚函数 virtual

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

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;还有一种利用 …

redis安装_Redis安装

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

C++ 自动锁

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

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;存放为运行函数而分配的局部变量、函数参数、返回数据、…

C++ sort()排序详解

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

性能测试流程_流性能

性能测试流程当我阅读Angelika Langer的Java性能教程时-Java 8流有多快&#xff1f; 我简直不敢相信&#xff0c;对于一个特定的操作&#xff0c;它们花费的时间比循环要长15倍。 流媒体性能真的会那么糟糕吗&#xff1f; 我必须找出答案&#xff01; 巧合的是&#xff0c;我最…

C++vector用法总结

点击蓝字关注我们来源自网络&#xff0c;侵删一.vector1. vector 说明1&#xff09;vector是C标准模板库中的部分内容&#xff0c;它是一个多功能的&#xff0c;能够操作多种数据结构和算法的模板类和函数库。2.&#xff09;vector之所以被认为是一个容器&#xff0c;是因为它能…

C++ STL 线性容器的用法

点击蓝字关注我们来源于网络&#xff0c;侵删1.vectorvector 是顺序容器的一种&#xff0c;是可变长的动态数组&#xff0c;支持随机访问迭代器&#xff0c;所有stl算法都能对 vector 进行操作。vector 容器在实现时&#xff0c;动态分配的存储空间一般都大于存放元素所需的空间…

redis复制_Redis复制

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

JavaWeb笔记之WEB项目

一. 版本控制 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理&#xff0c;是软件配置管理的核心思想之一。 版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变&a…

c++获取数组长度

点击蓝字关注我们来源于网络&#xff0c;侵删方法一&#xff1a; 用宏函数 #define#define foo(arr) sizeof(arr)/sizeof(arr[0])int main(){int arr[4] {1,2,3,4};cout<<foo(arr)<<endl; }方法二&#xff1a;用函数模板int getArrLen1(int *a ){return sizeof(a)…

C++ 利用硬件加速矩阵乘法

点击蓝字关注我们来源于网络&#xff0c;侵删1.矩阵乘法定义2.矩阵类封装我们用 C封装了一个n m 的矩阵类&#xff0c;用二维数组来存储数据&#xff0c;定义如下&#xff1a;#define MAXN 1000 #define LL __int64class Matrix { private:int n, m;LL** pkData; public:Matri…

redis分片_Redis分片

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