如何基于键值范围创建视图?不实例化向量,适配GCC 11
解决方案
你可以通过 range-v3 的views::for_each实现惰性遍历的键值对视图,无需创建中间std::vector<std::pair<Key, Value>>。由于GCC 11对C++23的std::views::flat_map/std::views::for_each支持不足,range-v3是更直接的选择。
实现代码
#include <range/v3/view/for_each.hpp> #include <range/v3/view/transform.hpp> // 生成键值对的惰性视图 auto key_value_view(const std::vector<Key>& keys) { return keys | ranges::views::for_each([](const Key& key) { // 对每个key,将lookup返回的value与key配对 return lookup(key) | ranges::views::transform([&key](const Value& value) { return std::make_pair(key, value); }); }); } // 使用方式 for (const auto& [key, value] : key_value_view(keys)) { // 处理键值对 }
原理说明
- 惰性求值:视图不会预先计算所有键值对,只有在遍历到对应元素时,才会调用
lookup(key)并生成std::pair<Key, Value>,完全避免了中间容器的内存开销。 - 生命周期安全:
key通过引用捕获自输入的std::vector<Key>,只要输入的keys在遍历期间保持有效,就不会出现悬垂引用问题。
若仅使用std::ranges(GCC 11限制)
由于GCC 11未实现C++23的std::views::flat_map和std::views::for_each,直接用标准库实现会比较繁琐,需要手动编写自定义range适配器。这种情况下更推荐使用range-v3方案,代码简洁且稳定。
内容的提问来源于stack exchange,提问作者Hesky Fisher
相关产品推荐
相关产品推荐

