找到所有的替代版本的find_if,而不只是第一个?

时间:2010-02-26 20:40:33

标签: stl iterator c++

是否有替代版本的std::find_if会在所有找到的元素上返回迭代器,而不仅仅是第一个?

示例:

bool IsOdd (int i) {
  return ((i % 2) == 1);
}

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);

std::vector<int>::iterator it = find_if(v.begin(), v.end(), IsOdd);
for(; it != v.end(); ++it) {
  std::cout << "odd: " << *it << std::endl;
}

3 个答案:

答案 0 :(得分:6)

您可以使用for循环:

for (std::vector<int>:iterator it = std::find_if(v.begin(), v.end(), IsOdd);
     it != v.end();
     it = std::find_if(++it, v.end(), IsOdd))
{
    // ...
}

或者,您可以将条件和操作放入仿函数(仅在条件为真时执行操作)并使用std::foreach

答案 1 :(得分:1)

STL中的

没有,但是boost提供了这个功能:

boost::algorithm::find_all

答案 2 :(得分:0)

首先总是试着想出典型的STL用法,你也可以去提升。以下是Charles提到的上述答案的简化形式。

    vec_loc = find_if(v3.begin(), v3.end(), isOdd);
if (vec_loc != v3.end())
{
    cout << "odd elem. found at " << (vec_loc - v3.begin()) << "and elem found is " << *vec_loc << endl;
    ++vec_loc;
}
for (;vec_loc != v3.end();vec_loc++) 
{
    vec_loc = find_if(vec_loc, v3.end(), isOdd);
    if (vec_loc == v3.end())
        break;
    cout << "odd elem. found at " << (vec_loc - v3.begin()) << "and elem found is " << *vec_loc << endl;
}