C++ - 迭代从find_if返回的std :: vector <>

Bre*_*ett 6 c++ iterator vector

我正在学习C++,所以我觉得这应该是一个非常简单的答案 - 但我似乎无法找到它.如果这是天真的话,我提前道歉.

我有一些std::vector<int>值,我试图找到数值的索引.

我正在关注此处的代码:

(以下重复):

// find_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector

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

int main () {
  std::vector<int> myvector;

  myvector.push_back(10);
  myvector.push_back(25);
  myvector.push_back(40);
  myvector.push_back(55);

  std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
  std::cout << "The first odd value is " << *it << '\n';

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

此示例打印第一个奇数值.我怎么能扩展这个来给我每个奇数值的索引值myvector这是正确的方法吗?

wes*_*ita 9

// find_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_if
#include <vector>       // std::vector

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

int main () {
  std::vector<int> myvector;

  myvector.push_back(10);
  myvector.push_back(25);
  myvector.push_back(40);
  myvector.push_back(55);


  std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd); 
  std::cout << "ODD values are: " << std::endl;     

  while(it != myvector.end() ){

    std::cout << *it  << " in position " << (it - myvector.begin())  << '\n';
    it = std::find_if (++it, myvector.end(), IsOdd); 
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:改it+1++it看@大卫·罗德里格斯-以下dribeas评论.

  • `it + 1`需要随机访问迭代器,这比`++ it`(只需要前向迭代器)要求更强.在这种特殊情况下,它很好,因为`std :: vector <> :: iterator`是随机访问,但使用`++ it`使解决方案对其他容器可行. (2认同)

Emi*_*lia 6

您可以递增it并将其用作进一步迭代的起点:

std::cout << "odd values: ";
auto it = myvector.begin();
while(it != myvector.end())
{
   it = std::find_if (it, myvector.end(), IsOdd);
   if(it == myvector.end()) break;
   std::cout << *it << ' ';
   ++it;
}
std::cout << endl;
Run Code Online (Sandbox Code Playgroud)

一种更加面向算法的方法,利用copy_if输出向量作为结果容器:

std::vector<int> results;
std::copy_if(myvector.begin(), myvector.end(), std::back_inserter(results), IsOdd);
Run Code Online (Sandbox Code Playgroud)

现在结果包含奇数值.(注意后面:插件在<iterator>标题中)