【问题标题】:C++: iterating over a list and an unordered_map in one loopC++:在一个循环中迭代一个列表和一个 unordered_map
【发布时间】:2020-09-07 13:14:28
【问题描述】:

在 c++ 中,我有一个 wstrings 列表和一个无序 wstring/wstring 映射。

std::list<std::wstring> m_L;
std::unordered_map<std::wstring, std::wstring> m_UM;

我需要在两个列表上运行一个循环,我不想重复循环代码(在无序映射中,我只关心第一个 wstring,而不关心第二个 wstring)。是否有一个迭代器构造可以让我在一个循环中迭代这两种类型?如果我尝试这样做,我会在 auto* n 上得到“无法推断自动类型”:

for (auto* n : { &m_L, &m_UM }) {
    for (auto& it : *n) {
        ...

【问题讨论】:

  • 使用 C++20 或 range-v3 我很确定您可以查看这两个容器的串联视图。
  • 而不是专注于您想要处理的内容:您在 1D 上下文中呈现的扁平 2D 矩阵将以什么顺序列出?您能否提供输入/输出示例以帮助我们帮助您?
  • 地图中的顺序无所谓,只要我遍历所有元素即可

标签: c++ list iterator unordered-map


【解决方案1】:

使用C++20ranges(或使用range-v3 库)你可以很简单地做到这一点:

int main() {
    std::list<std::string> l_str = {"a", "b", "c"};
    std::unordered_map<std::string, std::string> m_str = {{"d", "dd"}, {"e", "ee"}};

    using namespace ranges::views; // for concat(), all() and keys()
    for (auto& e : concat(all(l_str), keys(m_str))) {
        std::cout << e << ' ';
    }
}

输出:a b c e d


请注意,我将std::wstring 替换为std::string,但这对演示没有任何实际影响。

【讨论】:

  • 你对这首曲子 a b c e d 投了反对票,但无论如何都是真的。 :-) 由于它没有标记为 C++ 的未来版本,您对如何使其适应
  • @TedLyngmo 嘿,它的名称中有 unordered,不是吗?! :D 至于 C++20 的采用,我链接的 Eric 的实现适用于C++14。它是一个只有标题的库,所以简单的复制粘贴或简单的链接就足够了。
  • 我唯一反对的是音乐。 a b c e d。 :-) 我想我会暂时远离键盘电话...
  • @Fureeish 只是为了验证:是范围::视图还是范围::视图?使用 range-v3,我得到“没有成员 'views'。'view' 似乎没问题。我包括的内容:,
  • @MrSparkly 文件夹本身称为view,但命名空间称为views。以前叫ranges::view,但在标准化过程中采用了复数形式。 ranges::views 应该适合你。顺便说一句,如果您包含all.hpp,则不需要其他任何内容:>您已经包含了所有内容
猜你喜欢
  • 2016-04-07
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多