我不理解以下问题的答案:
编写一个C ++函数find_elem,它先取两个迭代器,然后取一些迭代器 类型为T的元素序列和类型为T的对象obj。它将迭代器返回到[first,last]范围内第一个出现的obj,如果obj不在序列中则返回迭代器last。
这就是答案
template <typename It, typename T>
It find_elem(It first, It last, const T & obj) {
while (first != last && (*first) != obj) // I DON'T UNDERSTAND THIS LINE
++first;
return first;
}
我不理解以下行while (first != last && (*first) != obj)
。当问题要求您使用(*first != obj)
的第一个实例返回迭代器时,为什么它是obj
。我也没有得到以下行++first
,因为你为什么要递增迭代器first
答案 0 :(得分:1)
++首先由while循环执行。 我会在这里写一下使用{}来更清楚:
while (first!=last && (*first)!=obj) {
++first;
}
因此,while循环检查if(* first)== obj。如果没有,那么它首先使用++移动到列表中的下一个元素,这会使迭代器递增。然后它会在first == last(意味着我们已经遍历整个列表)或者(* first)== obj时结束,这意味着我们找到了我们要找的东西。
答案 1 :(得分:1)
将first
的副本传递给该函数。这意味着该函数可以通过使用它来迭代序列来安全地修改变量。
这只是以下代码的简明替代方案:
template <typename It, typename T>
It find_elem(It first, It last, const T & obj) {
It iterator = first;
while (iterator != last && (*iterator) != obj)
++iterator;
return iterator;
}
顺便说一句......“通用模板”听起来很奇怪,因为模板总是通用的。我认为模板模板参数可以称为“通用模板”。