在C++中,我有一个wstrings列表和一个无序的wstringwstring映射。
std::list<std::wstring> m_L;
std::unordered_map<std::wstring, std::wstring> m_UM;
我需要在这两个列表上运行一个循环,而且我不想重复循环代码(在无序映射中,我只关心第一个wstrings,而不是第二个)。有没有一个迭代器结构可以让我在一个循环中遍历这两种类型?如果我尝试这样做,我在auto* n上得到 "无法推导出auto类型"。
for (auto* n : { &m_L, &m_UM }) {
for (auto& it : *n) {
...
用 C++20
's ranges
(或与 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 << ' ';
}
}
Output: a b c e d
.
请注意,我将 std::wstring
与 std::string
但这应该不会对演示产生任何实际影响。