随机生成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.mzph.cn/bicheng/59878.shtml

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

相关文章

AndroidStudio 加载grade失败问题解决

1:在gradle-wrapper.properties中添加国内镜像 distributionUrlhttp\://mtl-gradle-mirror.oss-cn-hangzhou.aliyuncs.com/gradle-5.6.4-bin.zip 2&#xff1a;在build.gradle中加上阿里镜像 repositories {maven { url https://maven.aliyun.com/repository/public/ }maven …

练习LabVIEW第四十三题

学习目标&#xff1a; 模拟红绿灯&#xff0c;红灯亮十秒&#xff0c;绿灯亮五秒&#xff0c;交替&#xff0c;并用波形图将波形显示 开始编写&#xff1a; 前面板 两个指示灯&#xff0c;一个红色&#xff0c;一个绿色&#xff0c;一个波形图&#xff1b; 程序框图 创建…

MySQL45讲 第十一讲 怎么给字符串字段加索引?

文章目录 MySQL45讲 第十一讲 怎么给字符串字段加索引&#xff1f;一、引言二、前缀索引&#xff08;一&#xff09;概念与创建方式&#xff08;二&#xff09;数据结构与存储差异&#xff08;三&#xff09;确定前缀长度的方法 三、前缀索引对覆盖索引的影响四、其他索引创建方…

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列

STM32CUBEIDE FreeRTOS操作教程&#xff08;八&#xff09;&#xff1a;queues多队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#…

[Web安全 网络安全]-学习文章汇总导航(持续更新中)

文章目录&#xff1a; 一&#xff1a;学习路线资源 1.路线 2.资源 二&#xff1a;工具 三&#xff1a;学习笔记 1.基础阶段 2.进阶阶段 四&#xff1a;好的参考 五&#xff1a;靶场 博主对网络安全很感兴趣&#xff0c;但是不知道如何取学习&#xff0c;自己一步一步…

2.Python解释器

python解释器程序&#xff0c;用来翻译python代码&#xff0c;并提交给计算机执行。 上一篇博客就是安装了python解释器程序 写一个python文件&#xff0c;在文件中写入多行代码并执行&#xff1a; 进入python后&#xff0c;输入exit()命令退出

Eslint 和 Prettier

提示&#xff1a;ESLint 和 Prettier 是两个常用的工具&#xff0c;它们在 JavaScript 生态系统中扮演着重要角色&#xff0c;但它们的功能和目的有所不同。 一、ESLint是什么&#xff1f; 1.目的&#xff1a; ESLint 是一个静态代码分析工具&#xff0c;主要用于查找和修复 …

JAVA笔记 | ResponseBodyEmitter等异步流式接口快速学习

先简单记录下简单使用跟测试&#xff0c;后续再补充具体&#xff0c;最近有用到&#xff0c;简单来说就是后端(服务端)编写个发射器&#xff0c;实现一次请求&#xff0c;一直向前端客户端发射数据&#xff0c;直到发射器执行完毕&#xff0c;模拟ai一句一句回复的效果 Respon…

安装Element-Plus与v-model在vue3组件中的使用

安装Element-Plus 1.安装Element-Plus # 选择一个你喜欢的包管理器# NPM npm install element-plus --save# Yarn yarn add element-plus# pnpm pnpm install element-plus 2.main.ts中导入 import { createApp } from vue import { createPinia } from piniaimport App fr…

Liunx:文件fd、重定向、管道

文件fd&#xff1a; 操作系统运行中一定存在着许多被打开的文件&#xff0c;这些文件需要被管理。一个进程会打开若干个文件。一个文件如果在操作系统中被打开&#xff0c;那么必须给该文件创建一个文件对象&#xff0c;包含被打开文件的各种属性。那么进程与文件的关系就变成…

如何产看SQL 查询的执行时间

要查看 SQL 查询的执行时间&#xff0c;尤其是毫秒级别&#xff0c;可以使用以下几种方法&#xff1a; 方法 1&#xff1a;使用 SET STATISTICS TIME 查看执行时间 SET STATISTICS TIME 会显示执行时间的详细信息&#xff0c;包括 CPU 时间和总耗时。启用后&#xff0c;SQL S…

linux笔记(DNS)

一、概念 DNS&#xff08;Domain Name System&#xff09;DNS 是一种分布式网络目录服务&#xff0c;主要用于将人类易于记忆的域名&#xff08;如 www.example.com&#xff09;转换为计算机可识别的 IP 地址&#xff08;如 192.168.1.1&#xff09;。它就像是互联网的电话簿&a…

Power Pivot、Power BI 和 SQL Server Analysis Services 的公式语言:DAX(数据分析表达式)

DAX&#xff08;Data Analysis Expressions&#xff09;是一种用于 Power Pivot、Power BI 和 SQL Server Analysis Services 的公式语言&#xff0c;旨在帮助用户进行数据建模和复杂计算。DAX 的设计初衷是使数据分析变得简单而高效&#xff0c;特别是在处理数据模型中的表关系…

优衣库在淘宝平台的全方位竞品分析与店铺表现研究:市场定位与竞争策略透视

优衣库品牌在淘宝平台的全方位竞品与店铺表现分析 一、品牌商品分析 1.商品列表与分类分析&#xff08;数据来源&#xff1a;关键词商品搜索接口&#xff1b;获取时间&#xff1a;2024.08.30&#xff09; 商品类别分布柱状图&#xff1a; 根据关键词商品搜索接口获取到的优衣…

设计模式-七个基本原则之一-里氏替换原则

里氏替换原则&#xff08;LSP&#xff09;面向对象六个基本原则之一 子类与父类的替代性&#xff1a;子类应当能够替代父类出现的任何地方&#xff0c;且表现出相同的行为。行为的一致性&#xff1a;子类的行为必须与父类保持一致&#xff0c;包括输入和输出、异常处理等。接口…

开源数据库 - mysql - innodb源码阅读 - master线程(一)

master struct /** The master thread controlling the server. */void srv_master_thread() {DBUG_TRACE;srv_slot_t *slot; // 槽位THD *thd create_internal_thd(); // 创建内部线程ut_ad(!srv_read_only_mode); //断言 srv_read_only_mode 为 falsesrv_main_thread_proce…

RocketMQ 自动注入消费者

目录 前言一、情景介绍二、问题分析三、代码实现 前言 之前接到一个需求&#xff0c;我们项目的技术负责人希望通过配置的形式&#xff0c;在项目启动的时候自动根据配置生成对应的消费者 觉得还有点意思&#xff0c;随即记录一下~ 一、情景介绍 比如我这里有一个消费者 Mes…

数据结构(C语言版)(第2版) 课后习题答案 李冬梅

数据结构(C语言版)(第2版) 第1章 绪论 1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 答案: 数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数…

Vue 自定义icon组件封装SVG图标

通过自定义子组件CustomIcon.vue使用SVG图标&#xff0c;相比iconfont下载文件、重新替换更节省时间。 子组件包括&#xff1a; 1. Icons.vue 存放所有SVG图标的path 2. CustomIcon.vue 通过icon的id索引对应的图标 使用的时候需要将 <Icons></Icons> 引到使用的…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.9-4.10

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.9 内容代价函数&#xff08;Content cos…