C++用于算法题中简化代码的冷门函数与类模板集合(持续更新中~)

news2025/1/21 4:54:35

1.accumulate

①求和:

第三个参数作为初始值,将区间[first, end)的值相加,返回初始值加上区间总和的值。

需要注意的是,如果总和超出区间中数的类型范围,可以将第三个参数强转成64位的long long类型

#include <iostream>    
#include <numeric>      // std::accumulate
#include <vector>       

int main() {
	int init = 0;
	std::vector<int> nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	std::cout << std::accumulate(nums.begin(), nums.end(), init);  //output:55
	return 0;
}

②自定义:

第三个参数传入函数或者对象,自定义函数包含两个参数,第一个参数为初始值,第二个参数将依次传入范围中的值,具体看代码注释;如果是对象,可在在对象中重载operator()实现上述功能

#include <iostream>    
#include <numeric>      // std::accumulate
#include <vector>

template<class T>
class myclass {
public:
	int operator()(T x, T y) { return x + 3 * y; }
};

int main() {
	int init = 0;
	std::vector<int> nums = { 100, 200, 300};

	std::cout << std::accumulate(nums.begin(), nums.end(), init, [&](int x, int y) { return x + 2 * y; }) << std::endl;;  //output:55
	//output: 0 + 100 * 2 + 200 * 2 + 300 * 2 = 1200

	std::cout << std::accumulate(nums.begin(), nums.end(), init, myclass<int>());
	//output: 0 + 100 * 3 + 200 * 3 + 300 * 3 = 1800
	return 0;
}

2.__builtin_ctz / __builtin_ctzll

__builtin系列的函数为GCC编译器的内联函数;

__builtin_ctz用于计算一个32位数中后导零的数量

cout << __builtin_ctz(16);  //16: 10000 --->  output:4

 __builtin_ctzll用于计算一个64位数中后导零的数量

cout << __builtin_ctzll(1LL << 40);   //output: 40

3.__builtin_clz / __builtin_clzll

__builtin_clz :用于计算一个32位数前导零数量

cout << __builtin_clz(8);   //(0000 0000 0000 0000 0000 0000 0000 1000) --> output: 28
int LOG = 31 - __builtin_clz(8);   //LOG = 3 --> 2^3 = 8

对于一个不是2的幂的数,求它以2为底的对数,用上述第二段代码求得的是向下取整之后的值

int LOG = 31 - __builtin_clz(15);   //(0000 0000 0000 0000 0000 0000 0000 1111)   LOG = 3 

__builtin_clzll:用于计算一个64位数前导零数量

3.__builtin_popcount

用于计算一个数的二进制中1的个数

cout << __builtin_popcount(15);   //output: 4

4.bitset

bitset类模拟了存放bool类型的array ,但是对其做了空间优化,每个元素0或1都只占用了一个位,并且可以用 [ ] 访问每一位的值

4.1 参数

4.2 构造函数

#include <iostream>
#include <bitset>
#include <string>
int main() {
		std::bitset<16> foo;                   
		std::bitset<16> bar(0xfa2);             
		std::bitset<16> baz("0101111001");     

		std::cout << foo;       //output:0000000000000000
		std::cout << bar;       //output:0000111110100010
		std::cout << baz;       //output:0000000101111001

		return 0;
}

4.3 成员函数

①operator[]   

int main() {
	std::bitset<8> bs;
	for (int i = 0; i < bs.size(); i++) {
		bs[i] = 1;
	}
	std::cout << bs;     //output:  11111111
}

②count    返回1的个数

int main() {
	std::bitset<8> bs(15);
	std::cout << bs.count();   //output:  4;
}

③to_string      转为string类型

④to_ullong     转为 unsigned long long类型

其他:bitset - C++ Reference (cplusplus.com)

5.lower_bound / upper_bound

C++标准库自带的二分查找算法,对于lower_bound(val),函数返回 [first, last) 范围内val下限(第一个大于等于val)位置的迭代器,而upper_bound则是返回 [first, last) 范围内val上限(第一个大于val)位置的迭代器

#include <iostream>     // std::cout
#include <algorithm>    // std::lower_bound, std::upper_bound, std::sort
#include <vector>       // std::vector

int main() {
	int myints[] = { 10,20,30,30,20,10,10,20 };
	std::vector<int> v(myints, myints + 8);           // 10 20 30 30 20 10 10 20

	std::sort(v.begin(), v.end());                // 10 10 10 20 20 20 30 30

	std::vector<int>::iterator low, up;
	low = std::lower_bound(v.begin(), v.end(), 20);          
	up = std::upper_bound(v.begin(), v.end(), 20);                   

	std::cout << "lower_bound at position " << (low - v.begin()) << '\n';    //output: 3
	std::cout << "upper_bound at position " << (up - v.begin()) << '\n';     //output: 6

	return 0;
}

需要注意的是,对于如vector这类支持随机迭代器的容器使用lower_bound/upper_bound函数的时间复杂度为logN, 而对于set/multiset这类不支持随机迭代器的容器,使用库函数的lower_bound/upper_bound函数的时间复杂度为N* logN

而set/multiset中也有实现二分查找的同名成员函数,时间复杂度为logN


 

算法运用:有序集合 + 滑动窗口
2817. 限制条件下元素之间的最小绝对差

220. 存在重复元素 III

6.min_element / max_element

返回区间 [first, last) 中最小值的迭代器

// min_element/max_element example
#include <iostream>     // std::cout
#include <algorithm>    // std::min_element, std::max_element
#include <vector>
int main() {
	std::vector<int> arr = { 3,7,2,5,6,4,9 };

	// using default comparison:
	std::cout << "The smallest element is " << *std::min_element(arr.begin(), arr.end());
	std::cout << "The largest element is " << *std::max_element(arr.begin(), arr.end());

	return 0;
}

7.iota

见文章【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序_Dusong_的博客-CSDN博客

持续更新中......

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

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

相关文章

CentOS 8 安装 Code Igniter 4

在安装好LNMP运行环境基础上&#xff0c;将codeigniter4文件夹移动到/var/nginx/html根目录下&#xff0c;浏览器地址栏输入IP/codeigniter/pulbic 一直提示&#xff1a; Cache unable to write to "/var/nginx/html/codeigniter/writable/cache/". 找了好久&…

企业数字化转型有没有通用的路径和准则?

数字化转型是利用数字技术从根本上改变企业运营方式并向客户提供价值的过程。它涉及将数字技术集成到组织活动的各个方面&#xff0c;从客户交互到内部流程。虽然数字化转型的具体方法可能会根据组织的目标、行业和现有基础设施而有所不同&#xff0c;但有一些通用路径和指南可…

异常的捕获和处理

目录 一、异常 1.异常概述 1.1认识异常 1.2Java异常体系结构 2.Java异常处理机制 2.1异常处理 2.2捕获异常 2.2.1使用try-catch捕获异常 2.2.2使用try-catch-finally处理异常 2.2.3使用多重catch处理异常 2.3抛出异常 2.3.1使用throws声明抛出异常 2.3.2使用throw…

小企业需不需要内部知识库?为什么都在倡导内部知识沉淀?

有多种方法可以提高员工敬业度和员工工作效率&#xff0c;从给予信任到创造积极的工作环境。但一还有一个不为人知但十分有效的方式——为员工创建良好的内部知识库。所以小企业同样需要内部知识库&#xff0c;以下是为什么倡导内部知识沉淀的理由&#xff1a; 知识积累与传承…

Http 1.0 1.1 2.0 3.0 版本差别

Http 1.0 发布年份&#xff1a;1996 非官方标准 短链接&#xff1a;每一次请求都对应一次TCP的连接与释放 开销大&#xff1a;每次请求都要TCP的连接与释放队头阻塞&#xff1a;每次请求都必须等上一次请求获得响应之后&#xff0c;才可以发送&#xff1b;效率低下 缓存&…

理论转换实践之keepalived+nginx实现HA

背景&#xff1a; keepalivednginx实现ha是网站和应用服务器常用的方法&#xff0c;之前项目中单独用nginx实现过负载均衡和服务转发&#xff0c;keepalived一直停留在理论节点&#xff0c;加之最近工作编写的一个技术文档用到keepalived&#xff0c;于是便有了下文。 服务组件…

Linux系统编程:线程同步及生产与消费者模型

目录 一. 线程同步的概念及功能 二. 线程同步的实现方法 2.1 条件变量相关函数 2.2 线程同步demo代码 三. 生成与消费者模型 3.1 生产与消费者模型的概念 3.2 生产与消费者模型实现代码 四. 总结 一. 线程同步的概念及功能 为了了解线程同步的概念及实现的功能&#xf…

Revit SDK:PointCurveCreation 创建点来拟合曲线

前言 这个例子通过留个例子来展示如何通过点来拟合曲线或者曲面。 内容 PointsParabola 生成抛物线的核心逻辑&#xff1a; double yctr 0; XYZ xyz null; ReferencePoint rp null; double power 1.2; while (power < 1.5){double xctr 0;double zctr 0;while (…

数据集学习笔记(七):不同任务数据集的标签介绍(包含目标检测、图像分割、行为分析)

文章目录 一、目标检测1.1 TXT1.2 COCO1.3 XML 二、图像分割2.1 json2.1 TXT2.1.1 json转txt 三、行为分析3.1 TXT3.2 JSON 一、目标检测 1.1 TXT 每行表示&#xff08;类别&#xff0c;中心x相对坐标&#xff0c;中心y相对坐标&#xff0c;相对宽度、相对高度&#xff09; 1…

FFmpeg4.3.1+h264在windows下编译与VS2017项目集成

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》&#xff0c;结合我自己的工作学习经历&#xff0c;我准备写一个音视频系列blog。本文是音视频系…

python spyder环境配置

首先安装python&#xff0c;配置环境变量等等 其次 pip install spyder 安装 spyder 最后启动 spyder&#xff0c;cmd下 执行 spyder&#xff0c;就打开了 调试下面的代码看看是否是系统的python import sys print(sys.executable) print(sys.path) 工具-偏好-python调试器 …

QT(8.30)常用类与组件,实现登录界面

1.作业&#xff1a; 完成一个登录界面(图片未附带): 头文件: #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QLineEdit>//行编辑器#include<QIcon>//图标#include<QLabel>//标签#include<QPushButton>//按钮#include<QIc…

【pyqt5界面化工具开发-13】QtDesigner功能择优使用

目录 0x00 前言&#xff1a; 一、完成基本的布局 二、其他功能的使用 三、在代码行开发 0x00 前言&#xff1a; QtDesigner工具的择优使用&#xff1a; 1、他的界面开发&#xff0c;是我们主要需要使用的功能 2、他的其他功能的使用&#xff0c;有需要就可使用&#xff…

报This application has no explicit mapping for /error 解决方法

Application启动类的位置不对&#xff0c;要将Application类放在最外侧&#xff0c;即包含所有子包。 没发现这个问题&#xff0c;卡了我老半天&#xff0c;兄弟们可以看一下你们是不是这个问题。

万人在线,一站式自动化运维 SysOM 3.0重磅发布!龙蜥社区系统运维 MeetUp 回顾来了

8 月 12 日&#xff0c;由龙蜥社区系统运维 SIG 主办&#xff0c;乘云数字协办的&#xff0c;主题为“观测&#xff0c;让运维更简单&#xff01;”的系统运维 MeetUp 于杭州圆满结束。来自乘云数字、谐云科技、乐维、云杉网络、擎创科技、观测云、阿里云以及浙江大学等众多厂商…

基于爬行动物算法优化的BP神经网络(预测应用) - 附代码

基于爬行动物算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于爬行动物算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.爬行动物优化BP神经网络2.1 BP神经网络参数设置2.2 爬行动物算法应用 4.测试结果&#xff1a;5…

vue3批量导出文件,打包成压缩包

1.下载插件 npm install jszip npm install file-saver2.封装方法 新建一个exportFileZip.js文件 // 引入实现下载压缩包的两个库 import JSZip from jszip; import FileSaver from file-saver; // 引入请求模块 import axios from axios // 实现下载压缩包按钮的方法 fileA…

kotlin实现猜数游戏

游戏规则 1.程序随机生成一个1到100的数字&#xff0c;作为MagicNumber 2.用户根据提示输入数据&#xff0c;只有三次机会输入数据 代码 代码很简单&#xff0c;使用了let内置函数 fun main() {//生成随机数可以使用java的方法//val magicNumber Random().nextInt(11)val ma…

GiraffeDet助力yolov8暴涨分---有可执行源码

Yolov8魔改–加入GiraffeDet模型提高小目标效果 VX搜索晓理紫关注并回复有yolov8-GiraffeDet获取代码 [晓理紫] 1 GiraffeDet模型 GiraffeDet是一种新颖的粗颈范例&#xff0c;一种类似长颈鹿的网络&#xff0c;用于高效的目标检测。 GiraffeDet 使用极其轻量的主干和非常深且…

助力网络管理的利器:企业办公网络中的VLAN划分策略

企业办公网络的性能和安全性对员工的高效工作和信息安全具有重要意义。在实现这一目标时&#xff0c;VLAN&#xff08;Virtual Local Area Network&#xff09;划分在网络设计中发挥着至关重要的作用。通过将办公网络划分为多个虚拟局域网&#xff0c;VLAN划分可以实现网络资源…