<p>你真的不应该试图直接从一种语言翻译成另一种语言。在</p>
<>在C++中,通常不编写函数来继承迭代器并生成新迭代器,而是编写输入和输出迭代器并从一个复制到另一个的函数。因此,您可以编写一个<code>zip</code>函数,在<code>T</code>上使用输入迭代器,在{<cd3>}上使用输入迭代器,在{<cd4>}上使用输出迭代器。在</p>
<p>但这样就不会把这两个调用链接在一起,因为您的<code>zip</code>函数不会返回任何可以有效传递给任何类型的<code>dict</code>函数的任何内容(比如迭代器范围)。相反,您可以创建一个<code>dict</code>模拟(一个<code>unordered_map</code>),在其中创建一个输出迭代器,并使用<code>zip</code>函数将对复制到其中。在</p>
<p>像这样:</p>
<pre><code>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()));
</code></pre>
<p>但我不认为你真的可以用这种方式在<code>unordered_map</code>上使用<code>inserter</code>,所以你必须写一个<code>map_inserter</code>函数。在</p>
<p>如果您在本地不知道<code>T</code>和<code>U</code>类型,那么您可能需要在一个从迭代器的元素类型中提取类型的函数模板中把这些都包装起来,这样您就可以<code>auto</code>了。(在C++ 11中,你可以^ {CD16>}它不需要函数,但表达式将是混乱的。)</p>
<hr/>
<p>如果您对<code>zip</code>和<code>map_inserter</code>有多种用途,可能值得编写它们。但否则,更好的解决方案是将其扩展为显式循环:</p>
^{pr2}$