在C ++中查找两个迭代器中的字符串

时间:2016-01-10 18:13:41

标签: c++ iterator

在C ++中,我知道你可以拥有多个迭代器。例如,如果你有一个想要在两个迭代器中看到字符串的第一个并发的函数,为什么代码看起来像这样:

Iterator found_it(Iterator one, Iterator two){
while(one != two && (*one) != "Bob"){
    one++;
}
return one;
}

*问题说一两个并不一定意味着begin()和end() - 这才真正给了我一个心灵****和混乱:S *

首先,如果Bob位于迭代器two中会发生什么?因为你只返回迭代器one?这就是我现在真正困惑的事情。

由于

3 个答案:

答案 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()作为参数传递给onetwo。但迭代器使您可以灵活地在容器中搜索中间范围。

例如,如果您想找到所有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)

onetwo是您要搜索的范围的开头和结尾(实际上刚刚结束)。这可能与容器上的begin()end()不同,如果您只想搜索子范围,或者迭代器根本不是来自容器。

请注意,one在循环中已更改;您不一定要返回one的原始值。

你的功能可以像这样重写:

Iterator found_it(Iterator begin, Iterator end) {
  Iterator current = begin;
  while (current != end && (*current) != "Bob"){
    current++;
  }
  return current;
}