如何将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
相关产品推荐
相关产品推荐

