您真的不应该尝试将习语直接从一种语言翻译成另一种语言。
在 C++ 中,您通常不会编写带有迭代器并生成新迭代器的函数;相反,您编写的函数接受输入和输出迭代器并从一个迭代器复制到另一个。因此,您可以编写一个zip 函数,它采用T 上的输入迭代器、U 上的输入迭代器和pair<T, U> 上的输出迭代器。
但是您不会以这种方式将两个调用链接在一起,因为您的zip 函数不会返回任何可以有效传递给@987654326 的任何内容(如迭代器范围) @ 功能。相反,您可以创建一个 dict 模拟(unordered_map),在其中创建一个输出迭代器,然后使用 zip 函数将对复制到其中。
类似这样的:
template <I1, I2, O>
void zip(I1 it1, I1 it1end, I2 it2, I2 it2end, O o) {
while ((it1 != it1end) && (it2 != it2end)) {
*o++ = std::make_pair(*it1++, *it2++);
}
}
std::unordered_map<T, U> mapping;
zip(c1.begin(), c1.end(), c2.begin(), c2.end(), std::inserter(mapping, mapping.end()));
除了我认为您实际上不能以这种方式在unordered_map 上使用inserter,因此您必须改为编写map_inserter 函数。
如果您在本地不知道 T 和 U 类型,您可能希望将这一切包装在一个函数模板中,该模板从迭代器的元素类型中提取类型,以便您可以 auto 它. (在C++11中,你可以decltype它而不需要函数,但是表达式会很乱。)
如果您对zip 和map_inserter 有多种用途,则可能值得编写它们。但除此之外,更好的解决方案是将其扩展为显式循环:
auto it1 = c1.begin(), it1end = c1.end(), it2 = c2.begin(), it2end = c2.end();
std::unordered_map<T, U> mapping;
while ((it1 != it1end) && (it2 != it2end)) {
mapping[*it1++] = *it2++;
}