在C ++中,我知道你可以拥有多个迭代器。例如,如果你有一个想要在两个迭代器中看到字符串的第一个并发的函数,为什么代码看起来像这样:
Iterator found_it(Iterator one, Iterator two){
while(one != two && (*one) != "Bob"){
one++;
}
return one;
}
*问题说一两个并不一定意味着begin()和end() - 这才真正给了我一个心灵****和混乱:S *
首先,如果Bob
位于迭代器two
中会发生什么?因为你只返回迭代器one
?这就是我现在真正困惑的事情。
由于
答案 0 :(得分:1)
当两个迭代器用作函数或标准算法的范围时,第二个迭代器不包含在范围内。那就是你应该考虑像
这样的范围[first, last )
如果像std::find
这样的函数或算法返回第二个迭代器,则意味着该范围不包含目标值。
如果第二个迭代器包含在范围内,则会出现一个问题,即当找不到目标值时返回的迭代器是什么?
例如考虑你自己的函数及其调用
template <class Iterator>
Iterator found_it(Iterator one, Iterator two){
while(one != two && (*one) != "Bob"){
one++;
}
return one;
}
//...
std::vector<std::string> v1 = { "Mary", "Bob" };
std::vector<std::string> v2 = { "Mary", "Peter" };
auto it1 = found_it( v1.begin(), v1.end() );
if ( it1 != v1.end() ) std::cout << *it1 << " is present in v1" << std::endl;
else std::cout << "Bob" << " is not present in v1" << std::endl;
auto it2 = found_it( v2.begin(), v2.end() );
if ( it2 != v2.end() ) std::cout << *it2 << " is present in v2" << std::endl;
else std::cout << "Bob" << " is not present in v2" << std::endl;
答案 1 :(得分:0)
如果&#34; Bob&#34;在迭代器2处,它超出了您想要搜索的范围,因此不应该找到它。第二个迭代器过去搜索范围。
因此,您要从one
进行搜索,但不包括two
。
如果您要搜索整个容器,则会将begin()
和end()
作为参数传递给one
和two
。但迭代器使您可以灵活地在容器中搜索中间范围。
例如,如果您想找到所有Bobs
,该怎么办?std::vector<std::string> names {"Tim", "Beryl", "Bob", "Danny", "Bob", "Lou"};
你可以得到第一个这样的:
auto bob1 = fond_it(names.begin(), names.end());
你可以得到第二个这样的:
auto bob2 = fond_it(bob1 + 1, names.end());
请注意,您可以在使用bob1
而不是在开头的一半时间开始搜索。
答案 2 :(得分:0)
one
和two
是您要搜索的范围的开头和结尾(实际上刚刚结束)。这可能与容器上的begin()
和end()
不同,如果您只想搜索子范围,或者迭代器根本不是来自容器。
请注意,one
在循环中已更改;您不一定要返回one
的原始值。
你的功能可以像这样重写:
Iterator found_it(Iterator begin, Iterator end) {
Iterator current = begin;
while (current != end && (*current) != "Bob"){
current++;
}
return current;
}