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.mzph.cn/news/337346.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;还有一种利用 …

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…

解析C++全排列

点击蓝字关注我们来源于网络&#xff0c;侵删1.C实现全排列的函数next_permutation(start,end)这个函数在暴力解决问题方面有很大作用&#xff0c;使用时需要引入头文件 < algorithm >&#xff0c;当当前序列不存在下一个序列时就会结束&#xff0c;若想得到一个序列的全…

redis开启redis_Redis聚类

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

C++ 读取文件操作

点击蓝字关注我们来源于网络&#xff0c;侵删1.先上代码&#xff1a;#include <fstream> #include<iostream> using namespace std;//文本文件读文件 void test01() {//1、包含头文件//2、创建流对象ifstream ifs;//3、打开文件并且判断是否打开成功ifs.open("…