正确的 std::set_union 代码是什么?
本网站声称set_union
相当于以下代码:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (true)
{
if (*first1<*first2) *result++ = *first1++;
else if (*first2<*first1) *result++ = *first2++;
else { *result++ = *first1++; first2++; }
if (first1==last1) return copy(first2,last2,result);
if (first2==last2) return copy(first1,last1,result);
}
}
但这似乎很奇怪:如果其中一个范围为空,不会崩溃(或导致其他未定义的行为)吗?两个 if
子句不应该位于 while
循环的开头而不是末尾吗?
This site claims that set_union
is equivalent to the following code:
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union ( InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result )
{
while (true)
{
if (*first1<*first2) *result++ = *first1++;
else if (*first2<*first1) *result++ = *first2++;
else { *result++ = *first1++; first2++; }
if (first1==last1) return copy(first2,last2,result);
if (first2==last2) return copy(first1,last1,result);
}
}
But that seems strange: Won't that crash (or result in other undefined behavior) if one of the ranges is empty? Shouldn't the two if
clauses be at the beginning of the while
loop, instead of the end?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我同意它看起来完全损坏了。为了进行比较,下面是 STLport 代码:
I agree that it looks totally broken. For comparison, here is the STLport code: