Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用公共值初始化std::map,无需重复_C++_Stl_Macros_Syntactic Sugar - Fatal编程技术网

C++ 使用公共值初始化std::map,无需重复

C++ 使用公共值初始化std::map,无需重复,c++,stl,macros,syntactic-sugar,C++,Stl,Macros,Syntactic Sugar,我想创建编译时已知关系的静态映射: { {k11, v1}, {k12, v1}, {k13, v1}, ... {k21, v2}, {k22, v2}, {k23, v2}, ... ... {kn1, vn}, {kn2, vn}, {kn3, vn}, ... } 每行可能包含许多键值对,因此,我更愿意这样写: { {v1, {k11, k12, k13, ...}}, {v2, {k21, k22, k23, ...}}, ..

我想创建编译时已知关系的静态映射:

{
    {k11, v1}, {k12, v1}, {k13, v1}, ...
    {k21, v2}, {k22, v2}, {k23, v2}, ...
    ...
    {kn1, vn}, {kn2, vn}, {kn3, vn}, ...
}
每行可能包含许多键值对,因此,我更愿意这样写:

{
    {v1, {k11, k12, k13, ...}},
    {v2, {k21, k22, k23, ...}},
    ...
    {vn, {kn1, kn2, kn3, ...}}
}

实现这一点最简单(可读性最高)的方法是什么?

我能想到的一个解决方案是使用以下函数:

#include <vector>
#include <tuple>
#include <map>
template <typename TValue, typename TKey>
std::map<TKey, TValue> reverse_map(
        std::vector<std::tuple<TValue, std::vector<TKey> > > const & relations){

    std::map<TKey, TValue> res;
    for (auto const & value_keys : relations){
        for(auto const & key : std::get<1u>(value_keys))
            res[key] = std::get<0u>(value_keys);
    }
    return res;
}
#包括
#包括
#包括
模板
标准::映射反向映射(
标准::向量常量和关系){
地图资源;
for(自动常量和值\u键:关系){
for(自动常量和键:std::get(值和键))
res[key]=std::get(值\键);
}
返回res;
}
我不确定执行这样一个函数会如何影响运行时间。
我很高兴听到是否有人对此有见解,或者有更好的解决方案。

这闻起来像是家庭作业,所以你最好表现出一些努力。也就是说,最简单的方法就是做对你来说最简单的事情。如果这个解决方案不够好,那么最简单的方法就不适合这个问题。“简单”还不够具体。我想看看有没有一个地方可以分发这种类型的家庭作业。。。我正在为我的工作编写一些代码,并尽可能使其可读。在写了1000多行这样的硬编码映射之后,我想看看是否可以让它更简洁。如果您希望让您的代码得到审查,请访问codereview.stackexchange.com