随机生成100组N个数并对比,C++,python,matlab,pair,std::piecewise_construct
随机生成100组N个数,数的范围是1到35,并检查是否包含目标数组的数字
python版本
import numpy as np
def count_groups_containing_obj(N, obj):# 随机生成100组N个数,数的范围是1到35groups = np.random.randint(1, 36, size=(1000, N))#print(groups)# 目标数组obj转换为numpy数组obj = np.array(obj)# 初始化包含obj的组数计数count = 0k=0ks=[]# 遍历每组,检查是否包含目标数组obj中的所有数for group in groups:k+=1# 使用np.isin检查组中的每个数是否都在obj中#print(np.all(np.isin(obj,group)))ii = np.all(np.isin(obj,group))if ii:count += 1ks.append(group)return count,ks# 输入N和obj
N = 8 # 每组的数的个数
obj = [2,3,10,16,28] # 目标数组# 调用函数并打印结果
result,ks = count_groups_containing_obj(N, obj)
print(f"包含目标数组的组数: {result}",result/10000)
print(ks)
matlab版本
function [count, ks] = count_groups_containing_obj(N, obj)% 随机生成100组N个数,数的范围是1到35groups = randi(35, 20000, N);% 目标数组obj转换为列向量obj = obj(:);% 初始化包含obj的组数计数count = 0;ks = [];% 遍历每组,检查是否包含目标数组obj中的所有数for i = 1:size(groups, 1)group = groups(i, :);% 使用ismember检查组中的每个数是否都在obj中if all(ismember(obj, group))count = count + 1;ks = [ks; group]; %#ok<AGROW>endend% 打印结果fprintf('包含目标数组的组数: %d\n', count);fprintf('比例: %.4f%%\n', count / 20000 * 100);
end
C++版本
把这个转C++,将Python代码转换为C++代码需要一些调整,特别是由于C++中没有直接对应的NumPy库。不过,我们可以使用标准库中的容器和算法来实现类似的功能。以下是一个C++版本的实现:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <numeric> // 生成一个包含N个1到35之间随机数的组
std::vector<int> generateGroup(int N) { std::vector<int> group(N); std::generate(group.begin(), group.end(), std::rand); // 生成随机数,但未限制范围 std::transform(group.begin(), group.end(), group.begin(), [](int x) { return x % 35 + 1; }); // 将随机数映射到1-35 return group;
} // 检查一个组是否包含目标数组中的所有数
bool containsAll(const std::vector<int>& group, const std::vector<int>& obj) { for (int num : obj) { if (std::find(group.begin(), group.end(), num) == group.end()) { return false; } } return true;
} // 统计包含目标数组的组的数量
std::pair<int, std::vector<std::vector<int>>> countGroupsContainingObj(int N, const std::vector<int>& obj) { std::srand(std::time(0)); // 初始化随机数种子 int count = 0; std::vector<std::vector<int>> ks; for (int i = 0; i < 1000; ++i) { std::vector<int> group = generateGroup(N); if (containsAll(group, obj)) { count++; ks.push_back(group); } } return {count, ks};
} int main() { int N = 8; // 每组的数的个数 std::vector<int> obj = {2, 3, 10, 16, 28}; // 目标数组 auto [result, ks] = countGroupsContainingObj(N, obj); double percentage = static_cast<double>(result) / 1000; std::cout << "包含目标数组的组数: " << result << ", 百分比: " << percentage << std::endl; // 输出包含的组(为了简洁,这里不打印所有组,只打印组数) std::cout << "包含的组数: " << ks.size() << std::endl; // 如果需要打印所有组,可以取消下面的注释 /* for (const auto& group : ks) { for (int num : group) { std::cout << num << " "; } std::cout << std::endl; } */ return 0;
}
几种初始化 std::pair
的方法:
在 C++ 中,std::pair
是一个模板类,用于存储两个元素的容器,这两个元素可以是不同的类型。std::pair
通常用于函数返回多个值,或者在标准库算法中作为键值对存储在容器中。
使用构造函数
#include <utility> // 或者 <pair>int main() {// 直接使用构造函数初始化std::pair<int, std::string> p(1, "one");return 0;
}
使用花括号 {} 初始化(列表初始化)
#include <utility> // 或者 <pair>int main() {// 使用花括号初始化std::pair<int, std::string> p = {1, "one"};return 0;
}
使用 make_pair
函数
#include <utility> // 包含 make_pairint main() {// 使用 make_pair 创建 pairstd::pair<int, std::string> p = std::make_pair(1, "one");return 0;
}
使用 std::piecewise_construct
(C++11 及以后版本)
如果你需要使用不同的构造函数来初始化 pair 的两个元素,可以使用 std::piecewise_construct
:
#include <utility> // 包含 piecewise_constructstruct MyStruct {int x;std::string y;
};int main() {// 使用 piecewise_construct 初始化std::pair<MyStruct, int> p(std::piecewise_construct,std::forward_as_tuple(1), // 使用 MyStruct 的构造函数std::forward_as_tuple(2)); // 使用 int 的默认构造函数return 0;
}
在这些例子中,std::pair
被用来存储不同类型的值。你可以根据需要选择最适合你的场景的初始化方法。
std::piecewise_construct
std::piecewise_construct
是 C++11 引入的一个实用工具,它用于构造 std::pair
或 std::tuple
等容器时,分别对每个元素使用不同的构造参数。这在你需要使用不同类型或不同构造函数初始化容器中的元素时非常有用。
用途和场景
-
不同构造参数:当你需要构造一个包含多种类型的
pair
或tuple
时,std::piecewise_construct
允许你为每个类型提供特定的构造参数。 -
效率:它可以帮助避免不必要的临时对象和拷贝,特别是在构造复杂对象时。
-
灵活性:它提供了一种灵活的方式来构造容器,特别是当元素的构造需要不同的参数或条件时。
示例
以下是使用 std::piecewise_construct
来构造 std::pair
的示例:
#include <utility>
#include <iostream>struct Person {std::string name;int age;Person(const std::string& name, int age) : name(name), age(age) {}
};int main() {// 使用 piecewise_construct 来构造 pairstd::pair<std::string, Person> personPair(std::piecewise_construct,std::forward_as_tuple("John Doe"), // 第一个元素的构造参数std::forward_as_tuple("John Doe", 30) // 第二个元素的构造参数);std::cout << "Name: " << personPair.first << ", Age: " << personPair.second.age << std::endl;return 0;
}
在这个例子中,std::pair
的第一个元素是一个 std::string
,只需要一个字符串参数来构造。第二个元素是 Person
类型,需要两个参数:一个字符串和一个整数。std::piecewise_construct
允许我们分别为这两个元素提供不同的构造参数。
注意事项
std::piecewise_construct
需要包含头文件<utility>
。- 使用
std::forward_as_tuple
来确保参数以正确的方式传递给构造函数。 - 这种方法在构造包含复杂对象的
pair
或tuple
时特别有用,尤其是当这些对象的构造函数参数不同时。
std::piecewise_construct
提供了一种高效且灵活的方式来构造包含多种类型元素的容器,使得代码更加清晰和易于维护。
相关文章:

随机生成100组N个数并对比,C++,python,matlab,pair,std::piecewise_construct
随机生成100组N个数,数的范围是1到35,并检查是否包含目标数组的数字 python版本 import numpy as np def count_groups_containing_obj(N, obj):# 随机生成100组N个数,数的范围是1到35groups np.random.randint(1, 36, size(1000, N))#pri…...

python爬虫获取数据后的数据提取
文章目录 python爬虫中的数据提取1.Json格式数据的数据提取2.Html格式数据提取之bs4解析器如何使用快速使用对象的种类Tagname和attributes属性NavigableString(字符串)BeautifulSoupComment 子节点.contents.children.descendants 父节点.parent.parents 节点内容.string.stri…...

前段(vue)
目录 跨域是什么? SprinBoot跨域的三种解决方法 JavaScript 有 8 种数据类型, 金额的用什么类型。 前段 区别 JQuery使用$.ajax()实现异步请求 Vue 父子组件间的三种通信方式 Vue2 和 Vue3 存在多方面的区别。 跨域是什么? 跨域是指…...

pairwise算法之rank svm
众所周知,point-wise/pair-wise/list-wise是机器学习领域中重要的几种建模方法。比如,最常见的分类算法使用了point-wise,即一条样本对应一个label(0/1),根据多条正负样本,使用交叉熵(cross entropy&#x…...

SAP RFC 用户安全授权
一、SAP 通讯用户 对于RFC接口的用户,使用五种用户类型之一的“通讯”类型,这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部,权限对象:S_RFC中,限制进一步可以调用的RFC函数授权ÿ…...

记录新建wordpress站的实践踩坑:wordpress 上传源码新建站因权限问题导致无法访问、配置新站建站向导以及插件主题上传配置的解决办法
官方文档:How to install WordPress – Advanced Administration Handbook | Developer.WordPress.org 但是没写权限问题,可以下载到 wordpress官方包。 把下载的wordpresscn的包解压并上传到服务器目录下,但是因为是root上传导致了权限问题…...

为啥学习数据结构和算法
基础知识就像是一座大楼的地基,它决定了我们的技术高度。而要想快速做出点事情,前提条件一定是基础能力过硬,“内功”要到位。 想要通关大厂面试,千万别让数据结构和算法拖了后腿 我们学任何知识都是为了“用”的,是为…...

Java - 免费图文识别_Java_免费_图片转文字_文字识别_spring ai_spring ai alibaba
本文主要是介绍借助阿里云免费的大模型额度来做高质量的图转文识别,图片转文字,或者文字识别都可以使用,比传统的OCR模式要直接和高效很多 。 本文使用的技术是spring ai qwen vl 。 Qwen vl有 100万Token 免费额度,可以用来免费…...

《JVM第6课》本地方法栈
文章目录 1 什么是本地方法1.1 本地方法的好处1.2 声明本地方法1.3 实现本地方法1. 生成头文件2. 编写C语言实现3. 编译C代码4. 运行Java程序 1.4 使用JNA1.5 总结 2 本地方法栈2.1 特点2.2 本地方法栈与Java虚拟机栈的区别2.3 本地方法栈的工作流程2.4 总结 无痛快速学习入门J…...

3.1 快速启动Flink集群
文章目录 1. 环境配置2. 本地启动3. 集群启动4. 向集群提交作业4.1 提交作业概述4.2 添加打包插件4.3 将项目打包4.4 在Web UI上提交作业4.5 命令行提交作业 在本实战中,我们将快速启动Apache Flink 1.13.0集群,并在Hadoop集群环境中提交作业。首先&…...

如何设计一个毫秒级的接口?
设计一个毫秒级的接口需要考虑多个方面,包括网络延迟、服务器性能、代码效率、数据库查询优化等。以下是一些建议,帮助你设计一个毫秒级的接口: 网络优化: 使用HTTP/2或更高版本,以减少连接建立和传输的开销。尽可能减…...

从语义实施工程师到大数据开发工程师的职业转型
在信息技术行业,随着数据驱动决策的流行和企业对大数据需求的急剧增加,越来越多的专业人士开始考虑将他们的技能转移到大数据领域。本文将探讨如何从一个语义实施工程师转变为一个大数据开发工程师。两者虽然都与数据密切相关,但在技术重点和…...

关联容器笔记
关联容器总结 有序关联容器 键值的顺序自动排序,键值必须支持 < 操作符 底层数据结构 使用平衡树,比如(红黑树)增删查的平均时间复杂度接近 O(logn) 种类 std::set:集合,包含唯一的键元素。 std…...

在阿里云快速启动Umami玩转网页分析
阿里云计算巢提供了Umami快速部署能力,使用者不需要自己下载代码,不需要自己安装复杂的依赖,不需要了解底层技术,只需要在控制台图形界面点击几下鼠标就可以快速部署并启动Umami,非技术同学也能轻松搞定。 什么是Umam…...

Linux练习作业
1.搭建dns服务器能够对自定义的正向或者反向域完成数据解析查询。 2.配置从DNS服务器,对主dns服务器进行数据备份 环境准备 主从服务器都需要进行的操作#关闭防火墙、SELinnux systemctl stop firewalld setenforce 0#软件安装 yum install bind -y实验一&#…...

FFMPEG录屏(21)--- Linux 下基于X11枚举所有可见窗口,并获取标题、图标、缩略图、进程路径等信息
在 Linux X11 下枚举窗口并获取窗口信息 在 Linux 系统中,X11 是一个非常流行的窗口系统,它提供了丰富的 API 用于管理和操作窗口。在这篇博客中,我们将详细介绍如何使用 X11 枚举当前系统中的窗口,并获取它们的标题、截图、进程…...

mybatis resultMap标签注意事项(pageHelper结合使用的坑)
背景 使用pageHelper时,发现分页数据异常,经过排查发现是resultMap 的问题。 resultMap介绍 在使用mybatis时,我们经常会使用在xml文件中编写一些复杂的sql语句,例如多表的join,在映射实体类时,又会使用…...

100种算法【Python版】第33篇——Tonelli-Shanks算法
本文目录 1 模素数下的二次剩余问题2 算法原理2.1 背景知识2.2 算法步骤3 算法示例4 python代码5 算法应用1 模素数下的二次剩余问题 在数论中,给定一个素数 p p p 和一个整数 n n n...

深度学习基础知识-全连接层
全连接(Fully Connected,简称 FC)层是深度学习神经网络中一种基本的层结构。它主要用于神经网络的最后几层,将高层特征映射到输出空间中。全连接层对数据的每个输入节点与每个输出节点进行连接,用于实现输入特征和输出…...

ffmpeg 提取mp4文件中的音频文件并保存
要从一个 MP4 文件中提取音频并保存为单独的音频文件,可以使用 ffmpeg 工具。以下是一个简单的命令示例: 命令格式 ffmpeg -i input.mp4 -vn -acodec copy output.mp3 参数解释 -i input.mp4: 指定输入文件为 input.mp4。 -vn: 禁用视频流࿰…...

【MySQL 保姆级教学】 复合查询--超级详细(10)
复合查询 1. 复合查询的作用2. 创建将进行操作的表2.1 员工表 emp2.2 部门表 dept2.3 薪资等级表 3. 基本查询回顾4. 多表查询4.1 多表查询的定义4.2 笛卡尔积4.3 内连接 inner join4.4 交叉连接 cross join4.5 左外连接 left join4.6 右外连接 right join4.7 自连接 5. 子查询…...

ONLYOFFICE:数字化办公的创新解决方案与高效协作平台
目录 前言—— 关于 ONLYOFFICE 桌面编辑器 1.首页介绍 2.电子表格 功能介绍 适用场景 3.ONLYOFFICE 在线Word功能 4.ONLYOFFICE 在线PPT功能 5.共同办公室 6.探索其他 总结 前言—— 在数字化办公的时代,传统的办公软件常常让人感到束缚与低效。而 ONLY…...

编译Kernel时遇到“error: ‘linux/compiler_types.h‘ file not found“的解决方法
问题描述: 在下载了一份安卓13项目的代码后进行make bootimage编译时遇到了下面编译报错: In file included from /home/bspuser/scode/kernel/msm-4.19/include/uapi/linux/stat.h:5: In file included from /home/bspuser/scode/kernel/msm-4.19/inc…...

开发之翼:划时代的原生鸿蒙应用市场开发者服务
前言 随着"纯血鸿蒙" HarmonyOS NEXT在原生鸿蒙之夜的正式发布,鸿蒙生态正以前所未有的速度蓬勃发展。据知已有超过15000个鸿蒙原生应用和元服务上架,覆盖18个行业,通用办公应用覆盖全国3800万多家企业。原生鸿蒙操作系统降低了接…...

代码随想录一刷——1.两数之和
当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 C: unordered_map class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int…...

vue自定义组件实现v-model双向数据绑定
一、Vue2 实现自定义组件双向数据绑定 ① v-model 实现双向数据绑定 在vue2中,子组件上使用v-model的值默认绑定到子组件的props.value属性上,由于子组件不能改变父组件传来的属性,所以需要通过$emit触发事件使得父组件中数据的变化…...

excel指定单元格输入相同的值,比如给D1~D10000输入现在的值
注意,一点不用用WPS,不然运行宏是会报:Droiact-Module1,第1行等Λ列语法错误: Unexpected identifier 步骤 1,altF11打开宏 2,输入脚本 3,点击运行按钮 成功后会看看到...

中国最强乳企伊利,三个季度净赚超百亿
伊利三季度的业绩完全超出了市场预期。 在一个飞天茅台都在不断跌价的消费趋势里,伊利三季度扣非净利润的同比增幅达到13.4%。大部分机构和投资者,都没料到伊利这一次的表现如此强悍。这一次,伊利在“大气层”。 并且,伊利前三季…...

SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext
SpringBoot源码系列文章 SpringBoot源码解析(一):启动流程之SpringApplication构造方法 SpringBoot源码解析(二):启动流程之引导上下文DefaultBootstrapContext 目录 前言一、入口二、DefaultBootstrapContext1、BootstrapRegistry接口2、BootstrapCon…...

配置elk插件安全访问elk前台页面
编辑els配置文件vim elasticsearch.yml,添加以下配置文件 用elk用户,启动els服务 关闭防火墙,查看els启动是否成功,通过是否启动java进程来判断 或者通过查看是否启动9200和9300端口来判断是否启动 交互模式启动密码配置文件interactive表示交…...