You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C++初始化图代码的文件数据源替换为vector?

解决方案

首先要明确:C++标准库的vector不支持直接传入三个模板参数,你需要用std::tuple<string, string, double>存储单条汇率数据,或者自定义结构体来封装数据。下面提供两种修改方案:

方式一:使用std::tuple存储数据

修改后的代码

#include <vector>
#include <tuple>

// 调整函数参数,传入数据源vector
bool Initialize_Graph(Graph *graph, const std::vector<std::tuple<std::string, std::string, double>>& exchangeData)
{
    // 校验数据量是否匹配,避免越界访问
    if (exchangeData.size() != static_cast<size_t>(NUMBER_OF_CURRENCIES * NUMBER_OF_CURRENCIES)) {
        return false;
    }

    std::string from, to;
    double rate;
    size_t dataIdx = 0; // 遍历vector的索引

    for(int i = 0; i < NUMBER_OF_CURRENCIES; i++)
    {
        for(int j = 0; j < NUMBER_OF_CURRENCIES; j++)
        {
            // 从tuple中提取数据,替代原文件流读取逻辑
            std::tie(from, to, rate) = exchangeData[dataIdx++];

            if(i == 0)
                graph[j].name = to;

            if(i == j)
                Edge_length(graph, i, j, 0);
            else
                Edge_length(graph, i, j, -log(rate));
        }
    }

    return true;
}

修改说明

  • 函数新增exchangeData参数作为数据源输入,替代原文件读取逻辑
  • 增加数据量校验:确保传入的vector大小等于预期的NUMBER_OF_CURRENCIES * NUMBER_OF_CURRENCIES,防止数组越界
  • 用std::tie从tuple中提取from、to、rate,通过索引dataIdx逐个遍历vector中的数据

方式二:自定义结构体存储数据(可读性更强)

先定义结构体

struct ExchangeRecord {
    std::string from;
    std::string to;
    double rate;
};

修改后的初始化函数

#include <vector>

bool Initialize_Graph(Graph *graph, const std::vector<ExchangeRecord>& exchangeData)
{
    if (exchangeData.size() != static_cast<size_t>(NUMBER_OF_CURRENCIES * NUMBER_OF_CURRENCIES)) {
        return false;
    }

    std::string from, to;
    double rate;
    size_t dataIdx = 0;

    for(int i = 0; i < NUMBER_OF_CURRENCIES; i++)
    {
        for(int j = 0; j < NUMBER_OF_CURRENCIES; j++)
        {
            // 直接访问结构体成员获取数据
            const auto& record = exchangeData[dataIdx++];
            from = record.from;
            to = record.to;
            rate = record.rate;

            if(i == 0)
                graph[j].name = to;

            if(i == j)
                Edge_length(graph, i, j, 0);
            else
                Edge_length(graph, i, j, -log(rate));
        }
    }

    return true;
}

修改说明

  • 自定义ExchangeRecord结构体,让数据语义更清晰,比tuple可读性更强
  • 函数参数换成封装好的ExchangeRecord类型vector
  • 直接访问结构体成员获取数据,替代原文件流读取操作

使用示例

无论哪种方式,调用时构造好对应vector传入即可:

// 方式一调用示例
std::vector<std::tuple<std::string, std::string, double>> data = {
    {"USD", "USD", 1.0}, {"USD", "EUR", 0.92},
    {"EUR", "USD", 1.09}, {"EUR", "EUR", 1.0}
    // 补充剩余汇率数据...
};
Graph myGraph;
Initialize_Graph(&myGraph, data);

// 方式二调用示例
std::vector<ExchangeRecord> data = {
    {"USD", "USD", 1.0}, {"USD", "EUR", 0.92},
    {"EUR", "USD", 1.09}, {"EUR", "EUR", 1.0}
    // 补充剩余汇率数据...
};
Graph myGraph;
Initialize_Graph(&myGraph, data);

内容的提问来源于stack exchange,提问作者Udbdjfj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 18:13:25