gpt4 book ai didi

c++ - 如何遍历 vector 图的 map map map map map map map vector

转载 作者:太空宇宙 更新时间:2023-11-04 14:57:14 27 4
gpt4 key购买 nike

我正在尝试从一个 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 中收集所有数据,而不必在 C++ 中有 7 个循环。

数据如下:

Map 1=>Map 1.1=>Map 1.1.1=>Map 1.1.2=>Map 1.1.3=>Map 1.1.4=>Vector 1.1.5=>Elem 1
=>Elem 2
Map 1.2=>Map 1.2.1=>Map 1.2.2=>Map 1.2.3=>Map 1.2.4=>Vector 1.2.5=> Elem 1
=>Elem 2
Map 2 =>Map 1.1=>Map 1.1.1=>Map 1.1.2=>Map 1.1.3=>Map 1.1.4=>Vector 1.1.5=>Elem 1
=>Elem 2
Map 1.2=>Map 1.2.1=>Map 1.2.2=>Map 1.2.3=>Map 1.2.4=>Vector 1.2.5=>Elem 1
=>Elem 2

所以我试图将所有 map 中的所有元素 1、元素 2 收集到一张 map 中。

有人可以帮我做这个而不是明显循环遍历每个映射并导致 C++ 中的 7 个循环吗?

感谢您的帮助。

(更新:哇,10 年后回头看看,它试图修复别人的遗留代码真是一场代码噩梦。希望现在不需要这个了:)

最佳答案

我喜欢@inflagranti 的想法 - 因此,在不要求效用的情况下,这是一个迭代所有内容的 for-each 模板。它使用 is_container来自 pretty printer 的特征,我不会在这里复制。

更新:现在完全可以处理裸值类型和对值类型。

更新 2: 简化了实现类,感谢@Luc Danton。

#include <algorithm>

#include "prettyprint.hpp"
using namespace pretty_print; // for "is_container" trait

template <typename T> struct is_pair : public std::false_type { };
template <typename S, typename T> struct is_pair<std::pair<S,T>> : public std::true_type { };

template <typename T> struct final_value { typedef T type; };
template <typename S, typename T> struct final_value<std::pair<S,T>> { typedef T type; };

template <typename Iter, typename F> void for_each_recursive(Iter begin, Iter end, F f);

template <typename F, bool Recurse> struct for_each_rec_impl;

template <typename F>
struct for_each_rec_impl<F, false>
{
template <typename Iter>
static typename std::enable_if<is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it) f(it->second);
}

template <typename Iter>
static typename std::enable_if<!is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it) f(*it);
}
};

template <typename F>
struct for_each_rec_impl<F, true>
{
template <typename Iter>
static typename std::enable_if<is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it)
{
for_each_recursive(it->second.begin(), it->second.end(), f);
}
}

template <typename Iter>
static typename std::enable_if<!is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it)
{
for_each_recursive(it->begin(), it->end(), f);
}
}
};

template <typename Iter, typename F>
void for_each_recursive(Iter begin, Iter end, F f)
{
typedef typename std::iterator_traits<Iter>::value_type value_type;
typedef typename final_value<value_type>::type type;

for_each_rec_impl<F, is_container<type>::value>::go(begin, end, f);
}

用法:for_each_recursive(v.begin(), v.end(), my_predicate<final_value_type>);

关于c++ - 如何遍历 vector 图的 map map map map map map map vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7126458/

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