如何在 C++ 中访问 map<string, vector<int>> 的值?

如何解决如何在 C++ 中访问 map<string, vector<int>> 的值?

我正在研究我的遗传算法版本,以解决 C++ 中的背包问题。我有一个字符串到向量的映射,如

map<string,vector<int>> objects
{
    {"Object 1",{7,20,15}},{"Object 2",{3,50,10}},{"Object 3",{5,80,12}},{"Object 4",{4,8}},{"Object 5",{2,40,11}}
};

和向量的向量

vector<vector<int>> population;

我将在哪里存储信息,例如

population[0] = {0,1,0};
population[1] = {1,1};
population[2] = {1,1};
...

每个向量称为一个individual,给定个体的每个元素表示相应对象的存在(1)或不存在(0)。因此,例如,第三个人 (population[2]) 有 Object 1Object 3Object 5

我想要做的是编写一个函数,该函数将接收来自 population 的索引并返回来自 objects 的相应值的总和。在 population[2] 的情况下,我想要另一个包含 {14,140,38} (7+5+2,20+80+40,15+12+11) 的向量。

但我很难访问 objects 地图的值。

map<string,vector<int>> objects {/*...*/}

vector<vector<int>> population;

void initializePopulation() {/*...*/}

void getScore(vector<int> individual,vector<int>& sum)
{
    for(int i = 0; i < 3; i++)
    {
        sum.push_back(0);
        for(int j = 0; j < 5; j++)
        {
            if(individual[j] == 1)
            {
                sum[i] += ???;
            }
        }
    }

int main()
{
   /*...*/
   initializePopulation();
   vector<int> sum;
   getScore(population[2],sum);

}

所以,如您所见,我不确定如何处理 sum[i]。有什么建议么?我对 C++ 不是很流利,所以更详细的答案将不胜感激!

解决方法

对于向量的向量和地图,您可以使用 for 每个循环! 当你的地图充满价值时

for(auto x: objects){
    cout<<x.first<<" "<<x.second<<endl;
}

这将在地图中打印键值对,中间有空格!

在这个问题中,你也必须迭代地图中的值(即第二个)!

{"Object 1",{7,20,15}}
{"Object 2",{3,50,10}}
{"Object 3",{5,80,12}}
{"Object 4",{4,8}}}
{"Object 5",{2,40,11}}

对于这样的事情,以下代码应该可以工作:

for(auto x: objects){
    cout<<x.first<<" ";
    for(auto y: x.second){
        cout<<y<<" ";
    }
    cout<<endl;
}

对于向量的向量,你可以使用相同的概念!

尝试将 Object 1,Object 2,.... 重命名为仅 1,2,.... 这将允许您通过使用 for 循环中的 j 来访问 map 中的值!

,

对于更简化的版本,请考虑使用此原型,因为您使用的是人口和遗传等词,我假设您的数据非常庞大,因此在传递数据时最好使用 const 引用 (const&,它们不会被复制,而是只读)。全局变量一般来说是个坏主意。

void getScore(map<string,vector<int>> const& objects,vector<int> const& individual,vector<int>& sum)
{
    // iterate over each object for the individual
    for(int i = 0; i < 5; i++)
    {
            // are you sure you want sum as {14,140,38} (7+5+2,20+80+40,15+12+11) 
            // not {14,15+12+11)
            // use else part for later
            if(individual[i] == 1)
            {
                // compute sum for each object
                // retrieve object vector
                auto it = objects.find("KEY"); // KEY generation discussed later
                if(it!=objects.end()){ // validate key :::: important
                  vector<int> ob = objects["KEY"];      //it->second
                  sum.push_back(std::accumulate(ob.begin(),ob.end(),0) ); //  https://www.cplusplus.com/reference/numeric/accumulate/
                }
            } /*else {
                sum.push_back(0);
            }*/
        }
    }

密钥生成:

1)。生成“对象 1”:

string key = "Object " + to_string(i+1)
auto it = objects.find(key);

2)。建议: 使用整数作为键 要么 使用类似的枚举

enum ObjList{
    OBJECT_1,OBJECT_2,OBJECT_3
}
auto it = objects.find(i); //mind your indexes

希望对您有所帮助,编码愉快XD

,

我认为通过一些小的线性代数,您的问题有一个简单的解决方案:实际上,如果您将与对象相关的数值数据存储到矩阵 A 中,那么对于每个 population 向量 p所需的结果只是 p^TA(或等效地,A^T p),其中 ^T 表示矩阵的 transpose或向量。

如果您不打算使用任何线性代数库,您可以自己实现 scalar product。下面是实现上述想法的代码。

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <numeric>

std::vector<int> SP(std::vector<std::vector<int>> const &M,std::vector<int> const &P){
    
    std::vector<int> sums(3,0);

    // perform p^T * A operation
    for (int j=0;j<3;j++)
        for (int i=0;i<5;i++)
            sums[j] += M[i][j] * P[i];

    return sums;
}
int main(){
    
    std::map<std::string,std::vector<int>> objects {
    {"Object 1",15}},{"Object 2",10}},{"Object 3",12}},{"Object 4",8}},{"Object 5",11}}
    };

    std::vector<std::vector<int>> population(3);
    population[0] = {0,1,0};
    population[1] = {1,1};
    population[2] = {1,1};


    std::vector<std::vector<int>> A;
    // Extract the numerical data from the map 
    for (auto const& [key,val] : objects)
        A.push_back(val);

    // vector in which the desired values are stored for the 3rd element of the population 
    std::vector<int> s = SP(A,population[2]);

    // Just for checking
    for (int it=0; it<s.size(); it++)
        std::cout << s[it] << std::endl;
    

    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res