随机生成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到35
    groups = np.random.randint(1, 36, size=(1000, N))
    #print(groups)
    
    # 目标数组obj转换为numpy数组
    obj = np.array(obj)
    
    # 初始化包含obj的组数计数
    count = 0
    k=0
    ks=[]
    
    # 遍历每组,检查是否包含目标数组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 += 1
            ks.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到35
    groups = 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>
        end
    end
    
    % 打印结果
    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_pair

int main() {
    // 使用 make_pair 创建 pair
    std::pair<int, std::string> p = std::make_pair(1, "one");

    return 0;
}

使用 std::piecewise_construct(C++11 及以后版本)

如果你需要使用不同的构造函数来初始化 pair 的两个元素,可以使用 std::piecewise_construct

#include <utility> // 包含 piecewise_construct

struct 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 来构造 pair
    std::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 提供了一种高效且灵活的方式来构造包含多种类型元素的容器,使得代码更加清晰和易于维护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法:只出现一次的数字II

题目 链接&#xff1a;leetcode链接 思路分析 这道题目其实是一个观察题&#xff0c;比较考察观察能力。 数组中只有一个元素只出现一次&#xff0c;其他的元素都出现三次 我们假设有n个元素出现三次 那么所有的元素的第i位的和加起来只有下面的四种情况 3n * 0 0 3n * 0…

【rust】rust基础代码案例

文章目录 代码篇HelloWorld斐波那契数列计算表达式&#xff08;加减乘除&#xff09;web接口 优化篇target/目录占用一个g&#xff0c;仅仅一个actix的helloWorld demo升级rust版本&#xff0c; 通过rustupcargo换源windows下放弃吧&#xff0c;需要额外安装1g的toolchain并且要…

鸿蒙基本组件结构

组件结构 1. 认识基本的组件结构 ArkTS通过装饰器Component 和Entry 装饰 struct 关键字声明的数据结构&#xff0c;构成一个自定义组件 自定义组件中提供了一个build函数&#xff0c;开发者需要在函数内以链式调用的方式进行基本的UI描述&#xff0c;UI描述的方法请参考UI描述…

Python并发编程库:Asyncio的异步编程实战

Python并发编程库&#xff1a;Asyncio的异步编程实战 在现代应用中&#xff0c;并发和高效的I/O处理是影响系统性能的关键因素之一。Python的asyncio库是专为异步编程设计的模块&#xff0c;提供了一种更加高效、易读的并发编程方式&#xff0c;适用于处理大量的I/O密集型任务…

快速开发工具 Vite

快速开发工具 vite 摘要&#xff1a; **概念&#xff1a;**Vite 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验 **构造&#xff1a;**Vite 主要由一个开发服务器和一套构建指令组成。 Vite底层的服务器转换和转发&#xff1a;以处理ts文件为例 1-读取 forma…

Servlet-Filter

文章目录 一. Filter 过滤器1. 概括2. 原理3. api配置过滤器(Filter)拦截路径1.xml 方式2.注解方式 4. 生命流程a.执行流程b.拦截路径c.过滤器链 5. 登录校验-Filter 一. Filter 过滤器 1. 概括 过滤器&#xff0c;顾名思义就是对事物进行过滤的&#xff0c;在 Web 中的过滤器…

Hadoop简介及单点伪分布式安装

目录 1. 大数据2. Hadoop简介3. Hadoop伪分布式安装4. Hadoop启动参考 1. 大数据 大数据的定义&#xff1a;一种规模大到在获取、存储、管理、分析方面大大超出传统数据库软件工具能力范围的数据集合。   特征&#xff1a;   1.海量的数据规模   2.快速的数据流转   3.…

python练习-袭击敌机

$ python -m pip install --user pygame1、画游戏框 class Settings:def __init__(self):self.screen_width 1200self.screen_height 800self.bg_color (230, 230, 230)import sys import pygame from settings import Settingsclass AlienInvasion:def __init__(self):pyg…

京东零售推荐系统可解释能力详解

作者&#xff1a;智能平台 张颖 本文导读 本文将介绍可解释能力在京东零售推荐系统中的应用实践。主要内容包括以下几大部分&#xff1a;推荐系统可解释定义、系统架构、排序可解释、模型可解释、流量可解释。 推荐系统可解释定义 推荐系统可解释的核心包括三部分&#xff0…

设备数据采集网关工作原理及优势-天拓四方

在日益智能化的时代&#xff0c;设备数据采集网关作为物联网系统中的关键组件&#xff0c;正扮演着越来越重要的角色。它不仅连接着各种设备&#xff0c;还负责数据的采集、处理与传输&#xff0c;为企业的数字化转型提供了坚实的基础。本文将详细探讨设备数据采集网关的定义、…

MLU运行SD3部署手册

文章目录 前言一、平台环境准备二、模型下载三、环境准备四.代码准备五.效果展示 前言 Stable Diffusion 3各版本模型在以下多个方面表现出色&#xff1a; 可定制性&#xff1a;轻松微调模型以满足特定创作需求&#xff0c;或根据定制的工作流程构建应用程序。 高效性能&#…

Webserver(3.3)生产者消费者模型

目录 生产者消费者简单模型条件变量信号变量 生产者消费者简单模型 //生产者消费者模型#include <stdio.h> #include<pthread.h> #include<stdlib.h> #include<unistd.h>struct Node{int num;struct Node * next; }; //头结点 struct Node * headNULL…

Obsidian之与Typora图片格式相互兼容

来源 [Obsidian之与Typora图片格式相互兼容 - 简书 (jianshu.com)](https://www.jianshu.com/p/303433fe82b9) 下载插件customer attachment location&#xff0c;并设置

计算机网络——TCP篇

TCP篇 基本认知 TCP和UDP的区别? TCP 和 UDP 可以使用同一个端口吗&#xff1f; 可以的 传输层中 TCP 和 UDP在内核中是两个完全独立的软件模块。可以根据协议字段来选择不同的模块来处理。 TCP 连接建立 TCP 三次握手过程是怎样的&#xff1f; 一次握手:客户端发送带有 …

vue echarts左右间距调整 左右空白

咱就说这样的左右间距丑不丑。。 经过调整后&#xff0c;嗯&#xff0c;好看了很多。页面也协调多了&#xff01; 直接上代码&#xff1a;添加以下配置数据&#xff1a; grid: {x: 50,y: 25,x2: 30,y2: 35 }, this.chart.setOption({width: 100%,xAxis: {show: false,type: ca…

【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;WebStorm 目录 问题概述 原因 解决方案 解决方法 潜在问题修改 最终效果呈现 额外内容 管理员界面路由配置 WebStorm背景更换 法一&#xff1a; 法二&#xff1a; 问题概…

[Joe3] 利用Halo后台注入功能定制Joe3主题页脚内容

1. 前言 如果你正使用Halo博客系统并选择了Joe3主题&#xff0c;你会发现其主题页脚设计非常丰富&#xff0c;也非常美观&#xff0c;可能也是我们选择Joe3的原因吧。但是每个人实际的需求是不同的&#xff0c;默认模板肯定不能都满足&#xff0c;你肯定也希望在页脚部分能有更…

CogVideo模型部署教程

一、 介绍 CogVideo 是一款在开源社区 GitHub 上备受瞩目的 AI 驱动视频生成解决方案&#xff0c;其核心技术依托于前沿的深度学习算法和模型架构。以下是对 CogVideo 的详细介绍&#xff1a; 1. 模型介绍 CogVideoX是 清影 同源的开源版本视频生成模型。 下表展示我们提供的…

【论文复现】基于深度学习的手势识别算法

本文所涉及所有资源均在这里可获取。 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看…

云上拼团GO指南——腾讯云博客部署案例,双11欢乐GO

知孤云出岫-CSDN博客 目录 腾讯云双11活动介绍 一.双十一活动入口 二.活动亮点 &#xff08;一&#xff09;双十一上云拼团Go (二&#xff09;省钱攻略 &#xff08;三&#xff09;上云&#xff0c;多类型服务器供您选择 三.会员双十一冲榜活动 (一)活动内容 &#x…