用共同的值初始化 std::map 不重复
Initialize std::map with common values without duplication
我想创建编译时已知关系的静态映射:
{
{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;
}
我不确定执行这样的函数对 运行 时间有何影响。
我很高兴听到是否有人对此有深入了解或更好的解决方案。
我想创建编译时已知关系的静态映射:
{
{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;
}
我不确定执行这样的函数对 运行 时间有何影响。 我很高兴听到是否有人对此有深入了解或更好的解决方案。