C++ STL详解(4)

点击蓝字

30f1d18215ce3ba680b2ffda9dcfcf53.png

关注我们

来源于网络,侵删

unordered_set / unordered_multiset

 这两个容器的方法与上一篇 C++ STL简介(3) 提到的 set / multiset 基本一样。但是要注意的是:这两个是无序的,基于哈希表实现的,增删改查的时间复杂度均为 O(1)。因为是无序的,所以不支持 lower_bound() 和 upper_bound() 以及迭代器的 ++、- -操作。unordered_set 中不允许有重复的元素,unordered_multiset 中允许有重复元素。

unordered_map / unordered_multimap

同 unordered_set / unordered_multiset,这两个容器的方法与上一篇 C++ STL简介(3) 提到的 map / multimap 也基本一样。但是要注意的是:这两个也是无序的,基于哈希表实现的,增删改查的时间复杂度均为 O(1)。因为是无序的,所以不支持 lower_bound() 和 upper_bound() 以及迭代器的 ++、- -操作。unordered_map 中不允许有重复的元素,unordered_multimap 中允许有重复元素。

bitset

简介

bitset 模板类由若干个位(bit)组成,它提供一些成员函数,使程序员不必通过位运算就能很方便地访问、修改其中的任意一位。bitset 模板类在头文件 #include<bitset> 中。

 bitset 可看作一个 多位二进制数,每 8 位占用 1 个字节,相当于采用了状态压缩的二进制数组,并支持基本的位运算。在估算程序运行的时间时,我们一般以 32 位整数的运算次数为基准,因此 n 位 bitset 执行一次位运算的复杂度可视为 n / 32,效率较高。

声明

 bitset 的声明方式为:bitset<32> bit; 注意:<> 中为 位数 。初始条件下声明的容器中全部为 0。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<32> bit;cout << bit;// 输出结果:00000000000000000000000000000000 (32个0) return 0;
}

声明并初始化

 在声明的同时也可以进行初始化,可以使用 十进制、十六进制 的数进行初始化,也可以使用 字符串 进行初始化。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {// 1.使用十进制进行初始化 bitset<8> bit(32);cout << bit << endl;// 输出十进制 32 的二进制:00100000// 2.使用十六进制进行初始化 32 的十六进制为 0x20 bitset<8> bit1(0x20);cout << bit1 << endl;// 输出十六进制 32 的二进制:00100000// 3.使用字符串进行初始化string str = "00100000";bitset<8> bit2(str);cout << bit2 << endl;// 输出 00100000return 0;
}

operator[]

 可以像使用数组一样来对 bitset 进行操作。可以使用 [] 进行访问,也可以进行赋值或者修改。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {// 1.使用十进制进行初始化 bitset<8> bit(32);cout << bit << endl;// 输出十进制 32 的二进制:00100000// 输出第 6 位cout << bit[5] << endl;  // 下标从 0 开始,最右边为第 1 位,下标为 0。// 输出结果:1 // 将第 6 位修改为 0bit[5] = 0;cout << bit; // 输出结果:00000000 return 0;
}

operator&=,|=,^=,~

 进行二进制与、或、异或及非。bitset 支持位运算。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<16> dest;string pattern_str = "1001";bitset<16> pattern(pattern_str);for (size_t i = 0, ie = dest.size()/pattern_str.size(); i != ie; ++i) {dest <<= pattern_str.size();dest |= pattern;}cout << dest << '\n';// 输出结果:1001100110011001return 0;
}

operator<<,>>

 bitset 可以进行二进制的左移、右移运算。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit("01111111");cout << bit << endl;// 输出结果:01111111// 将 bit 左移一位并用 b 接收 auto b = (bit << 1);cout << b << endl;// 输出结果:11111110 return 0;
}

operator==,!=

 比较两个 bitset 是否相等。若每一位都相等则返回 true ,否则返回 false。

all()

 若全部位被设为 true 则为 true ,否则为 false。即判断 bitset 中是否全部为 1。

any()

 若任何一位被设为 true 则为 true ,否则为 false。即判断 bitset 中是否至少有一个 1。

none()

 若无位被设为 true 则为 true ,否则为 false。即判断 bitset 中是否全为 0。

count()

 返回设为 true 的位数。即返回 bitset 中 1 的个数。

set()

 set() 方法有两个重载方法。

  • 设置所有位为 true 。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit;cout << bit << endl;// 输出结果:00000000// 将所有位设置为 1 bit.set(); cout << bit;// 输出结果:11111111return 0;
}
  • set(pos, value) 设置在 pos 的位为值 value 。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit;cout << bit << endl;// 输出结果:00000000// 将第一位设置为 1 bit.set(0, 1); cout << bit;// 输出结果:00000001return 0;
}

reset()

 将所有位置设置为 false。

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit("11111111");cout << bit << endl;// 输出结果:11111111// 将所有位置设置为 0 bit.reset(); cout << bit;// 输出结果:00000000return 0;
}

flip()

 进行 取反 操作,等价于位运算的 ~。

  • flip() 将所有位置取反

#include<iostream>
#include<bitset>
#include<string>using namespace std;int main() {bitset<8> bit("10101010");cout << bit << endl;// 输出结果:10101010// 将所有位置取反 bit.flip(); cout << bit;// 输出结果:01010101return 0;
}
  • flip(pos) 将位于 pos 位置的数据进行取反。

740221c4634aae6887024bb28a6965c3.gif

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

b1559f210918be9eceed18ca8adb1cd0.gif

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

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

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

相关文章

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年…

python输出结果为none_python的reverse函数翻转结果为None的问题

今天刷二级题的时候&#xff0c;遇到一个问题>>> L2[1,2,3,4]>>> L3L2.reverse()>>> print( L3)None>>> print(L3)None>>> print(L2.reverse())None其实我想让它输出[4,3,2,1]reverse函数&#xff0c;翻转列表然后我改了一下>…

性能测试流程_流性能

性能测试流程当我阅读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;是因为它能…

python中创建集合的语句_Python 集合(set) 介绍

集合 set集合是可变的容器集合内的数据对象都是唯一的(不能重复多次的)集合是无序的存储结构&#xff0c;集合中的数据没有先后关系集合内的元素必须是不可变对象集合是可迭代对象(可以用for等遍历)集合是相当于只有键&#xff0c;没有值的字典(键则是集合的数据)创建空集合&am…

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…