C++:在一个循环中迭代一个列表和一个 unordered_map

C++: iterating over a list and an unordered_map in one loop

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

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

我需要 运行 对两个列表进行循环,我不想重复循环代码(在无序映射中,我只关心第一个 wstrings,而不关心第二个)。是否有一个迭代器构造允许我在一个循环中迭代这两种类型?如果我尝试这样做,我会在 auto* n:

上得到 "cannot deduce auto type"
for (auto* n : { &m_L, &m_UM }) {
    for (auto& it : *n) {
        ...

使用 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,但这不会对演示产生任何实际影响。