gpt4 book ai didi

c++ - C++在运行时嵌套不同类型的查找映射

转载 作者:行者123 更新时间:2023-12-01 14:58:05 24 4
gpt4 key购买 nike

我必须将Java的多列查找对象转换为C++ 14(不考虑使用C++ 17或boost,即:variant / any)。

查找数据在运行时加载(从csv或json),并且可以包含4种类型std::stringintdoublelong long。一个文件可以包含2到N列。下面是一个简单的例子:

Country    Dept  Ratio   Final
"FR" 75 1.25 12
"FR" 01 0.25 15
"UK" 24 1.5 7
....

目的是使用N-1个参数(与各列匹配)找到最终值。

每列(“最终”除外)均包含参数“搜索”,该参数可以为=,<,>。搜索总是相等地进行,如果找不到,并且“搜索”为<或>,则使用最接近的<或>匹配。

例如,可以通过lookup(“FR”,72,1.28)来完成示例查询。

在Java中,这是使用嵌套的 TreeMap来实现的,它等效于std::map,但是可以在运行时实例化它们(因为它是java)。

到目前为止,我已经使用了 std::map,但是我的实现非常繁琐,因为它是通过动态转换 shared_ptr<void>等的嵌套类完成的。

我试图找出一个很好的“模板方式”来实现这一点(使用 std::map或其他方式)。

任何提示表示赞赏

编辑:
我们可以有1000个条目,对于上面的数据示例,我的想法是使
std::map<std::string, std::map<int, std::map<double, int>>>

但是由于类型仅在运行时才知道,因此无法完成上述操作。
我也测试了这个:
struct BaseDimension
{
}

template<typename X, typename Y>
struct Dimension: BaseDimension
{
std::shared_ptr<std::map<X, Y>> _map;
}

但是我有一个问题,要从那里组织“Tree”,从BaseDimension如何动态转换为Dimension,避免切换到所有可能的类型对。

使用相同的数据样本,我们本来可以
Dimension<std::string, BaseDimension>
Dimension<int ,BaseDimension>
Dimension<double, int>

我刚刚找到了C++ 14(mapbox)的std::variant,我将检查它是否使此操作更容易

最佳答案

如果我正确理解了您的问题,则可以使用 std::tuple witch重载比较运算符,可以在任何类型的C++容器(例如 std::map std::vector 等)或您自己的容器中使用它。

使用std::vector的示例为:

Live sample

#include <iostream>
#include <vector>
#include <tuple>

//overloading << operator for std::cout
std::ostream& operator << (std::ostream& os, std::tuple<std::string, int, double, long long> t) {
os << std::get<0>(t) << " " << std::get<1>(t) << " " << std::get<2>(t) << " " << std::get<3>(t);
return os;
}

int main()
{
std::vector<std::tuple<std::string, int, double, long long>> tuple_vector;

tuple_vector.push_back(std::make_tuple("test string", 1, 1.2, 1));
tuple_vector.push_back(std::make_tuple("string", 1, 1.0, 1));

std::cout << (tuple_vector.at(0) == tuple_vector.at(1)) << " "; //1 (true)
std::cout << (tuple_vector.at(0) > tuple_vector.at(1)) << std::endl; //0 (false)

std::cout << tuple_vector.at(0); //using << overloaded << operator

}

输出:
1 0
test string 1 1.2 1

关于c++ - C++在运行时嵌套不同类型的查找映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60262729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com