随机生成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::pairstd::tuple 等容器时,分别对每个元素使用不同的构造参数。这在你需要使用不同类型或不同构造函数初始化容器中的元素时非常有用。

用途和场景

  1. 不同构造参数:当你需要构造一个包含多种类型的 pairtuple 时,std::piecewise_construct 允许你为每个类型提供特定的构造参数。

  2. 效率:它可以帮助避免不必要的临时对象和拷贝,特别是在构造复杂对象时。

  3. 灵活性:它提供了一种灵活的方式来构造容器,特别是当元素的构造需要不同的参数或条件时。

示例

以下是使用 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 来确保参数以正确的方式传递给构造函数。
  • 这种方法在构造包含复杂对象的 pairtuple 时特别有用,尤其是当这些对象的构造函数参数不同时。

std::piecewise_construct 提供了一种高效且灵活的方式来构造包含多种类型元素的容器,使得代码更加清晰和易于维护。

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

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

相关文章

数据结构之二叉树的收尾(性质)

1&#xff09;对任何⼀棵二叉树, 如果度为 0 其叶结点个数为 n0 , 度为 2 的分支结点个数为 n2 , 则有n0n2 1 1. 某二叉树共有 399 个结点&#xff0c;其中有 199 个度为 2 的结点&#xff0c;则该二叉树中的叶子结点数为&#xff08; &#xff09; 解&#xff1a;n0n2 1 n01…

MyBatis-Plus条件构造器:构建安全、高效的数据库查询

一、关于条件构造器(Wrapper) 1.1 简介 MyBatis-Plus 提供了一套强大的条件构造器&#xff08;Wrapper&#xff09;&#xff0c;用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件&#xff0c;无需编写繁琐的 SQL 语句&#xff0c;从而提高开…

HT3286 免电感滤波2x30W D类立体声音频功放

1 特性 ● 输出功率(BTL模式) 2x20W(VDD14.5V,RL4Ω,THDN10%) 2x33W(VDD22V,RL8Ω,THDN10%) ● 输出功率(PBTL模式) 50W(VDD22V,RL4Ω,THDN1%) ● 单电源系统&#xff0c;4.5V-22V宽电压输入范围 ● 超过90%效率&#xff0c;无需散热器 ● 可选输出模式:BD和1SPW ● MUTE和关断…

安当ASP系统:适合中小企业的轻量级Radius认证服务器

安当ASP&#xff08;Authentication Service Platform&#xff09;身份认证系统是一款功能强大的身份认证服务平台&#xff0c;特别适用于中小企业。其中&#xff0c;简约型Radius认证服务器是安当ASP系统中的一个重要组成部分。以下是对该系统的详细介绍&#xff1a; 一、主要…

开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二)

一、前言 GLM-4是智谱AI团队于2024年1月16日发布的基座大模型&#xff0c;旨在自动理解和规划用户的复杂指令&#xff0c;并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等&#xff0c;支持128K的上下文窗口&#xff0c;使其在长文本处理和精度召回方面表现优异&a…

第七部分:1. STM32之ADC实验--单通道实验(滑动变阻器调节电压)

主要利用一个模拟量的电位器来实时改变电压值&#xff0c;通过STM32自带的ADC通道来采集这个数据&#xff0c;并打印出来&#xff01;本实验是单通道实验 一句话&#xff0c;学完STM32&#xff0c;我就往南走&#xff0c;我的工资只有5000.~~~~Whappy 实验代码&#xff1a; A…

50岁+人群月活超1亿,短剧迎来新对手,小程序游戏“收割”中老年

抢夺中老年流量&#xff1a;微短剧向左&#xff0c;小游戏向右 作者&#xff5c;AgeClub 干货抢先看 1.《黑神话&#xff1a;悟空》走红&#xff0c;吸引大量玩家入坑单机市场。与硬核单机游戏不同&#xff0c;在渗透率更高的小游戏领域&#xff0c;聚集了更多“网瘾”中老年…

MySQL OnlineDDL添加字段

alter 添加字段 5.7 默认是algorithminplace以及locknone来进行DDL操作&#xff0c;但是添加列整个执行过程中也会部分涉及到Copy Table。 如果有碎片比较大&#xff0c;因为会copy表会碎片整理&#xff0c; 添加字段成功后有可能磁盘使用空间降低&#xff0c;添加过程中磁盘…

WPF中如何简单的使用MvvmLight创建一个项目并进行 增删改查

目录 第一步&#xff1a;创建项目后下载如下两个NuGet程序包&#xff0c;然后删除删掉using Microsoft.Practices.ServiceLocation; 并且引入using CommonServiceLocator; 第二步&#xff1a;删除原来的XAML文件并创建如下的包结构然后创建一个在View文件夹中创建一个Main窗体 …

ssm校园媒体信息发布系统—计算机毕业设计源码42272

目 录 摘要 1 绪论 1.1研究背景与意义 1.2国内外研究现状 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 校园媒体信息发布系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

【数据结构】线性表——链表

写在前面 本篇笔记记录线性表——链表的主要形式&#xff0c;虽然链表有8种形式&#xff0c;但是只要精通笔记中编写的两种&#xff0c;即可触类旁通。 文章目录 写在前面一、链表的概念及结构二、链表的分类三、无头单向非循环链表3.1、链表的实现3.1.1、链表的结构体定义3.1…

Java:168 springboot小区团购管理

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 ​ 系统有管理员&#xff0c;用户两个角色。 主要的功能有用户信息管理、商品信息管理、商品类型管理、商品订单管理、公告信息管理、公告类型管理 …

CSS如何改变滚动条的颜色样式粗细?

默认滚动条很丑怎么办&#xff1f;如何改版滚动条的粗细&#xff0c;颜色&#xff0c;让它更美观&#xff1f;CSS如何改变滚动条的粗细&#xff1f; 干货来了 /* Webkit内核浏览器的滚动条样式 */ ::-webkit-scrollbar {width: 4px; /* 设置滚动条的宽度 */ }::-webkit-scroll…

idea连接docker并构建镜像

安装docker 安装docker idea连接docker 安装docker插件 设置docker连接 设置docker.exe 这个docker.exe是为了运行docker&#xff0c;可以通过安装docker desktop获取 docker desktop下载地址 右键图标找到文件位置 在同级的resource中 编写Dockerfile # 使用官方 Nginx…

你竟然赶我走

目录 解题思路 题目设计原理 总结 解题思路 拿到图看属性没问题&#xff0c;格式是 jpg 的&#xff0c;但是这张图片肯定不简单。 文件分离不出东西。 使用 stegsolve 打开&#xff0c;使用文件格式分析功能&#xff0c;拉到最底下&#xff0c;flag 浮出水面。好吧&#xff…

ssm065基于JAVA WEB技术大健康综合咨询问诊平台的设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;健康综合咨询问诊平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本健康综合咨询…

masm汇编字符输入换行输出演示

从键盘读取一个字符并换行输出 assume cs:codecode segmentstart:mov ah, 1int 21hmov bl, almov dl, 10 mov ah, 2int 21h mov dl, blmov ah, 2int 21hmov ah, 4chint 21hcode ends end start 效果演示&#xff1a;

设备管理网关(golang版本)

硬件设备&#xff1a;移远EC200A-CN LTE Cat 4 无线通信模块 操作系统&#xff1a;openwrt 技术选型&#xff1a;layui golang sqlite websocket 工程结构 界面展示 区域管理 设备管理 运行监控 系统参数 资源文件 版本信息

变电站接地电阻监测装置-输电铁塔接地电阻监测装置:实时监测,预防故障

变电站接地电阻监测装置 接地电阻对电力系统的安全和稳定性至关重要&#xff0c;但在高压环境和极端气候下&#xff0c;接地系统可能出现性能下降&#xff0c;增加故障和跳闸的风险。传统的人工检测方法常常无法及时发现这些问题&#xff0c;并且操作繁琐。为此&#xff0c;我…