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

时间:2014-02-03 17:29:45

标签: c++ vector iterator

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

我有std::vector<int>个值,我正在尝试找到奇数值的索引。

我正在关注here的代码:

(下面重复):

// 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;
}

此示例打印第一个奇数值。 我如何对此进行扩展,以便为myvector中的每个奇数值提供索引值?这是正确的方法吗?

6 个答案:

答案 0 :(得分:10)

// 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;
}

编辑:将it+1更改为++it,请参阅下面的@DavidRodríguez - dribeas评论。

答案 1 :(得分:5)

您可以增加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;

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

std::vector<int> results;
std::copy_if(myvector.begin(), myvector.end(), std::back_inserter(results), IsOdd);

现在结果包含奇数值。 (注意背面:插入器位于<iterator>标题中)

答案 2 :(得分:3)

您可以通过减去序列的开头找到向量迭代器的索引(更常见的是,任何随机访问迭代器):

std::cout << "The index is " << (it - myvector.begin()) << '\n';

更一般地说,有一个std::distance函数可以为你提供前向迭代器之间的距离。例如,如果您的容器是list,则可以使用它;但你可能不想这样做,因为它会慢得多。

要找到所有奇数,你需要一个循环来再次调用find,从你刚找到的元素之后的元素开始。

答案 3 :(得分:2)

您需要循环。标准库的迭代器算法设计使这很容易:

#include <iterator>

for (auto it = myvector.begin();
     (it = std::find_if(it, myvector.end(), IsOdd)) != myvector.end(); )
{
    std::cout << *it << " at index " << std::distance(myvector.begin(), it) << "\n";
}

答案 4 :(得分:2)

更改这两行:

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

成像:

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

答案 5 :(得分:0)

一个不错的紧凑型解决方案可能是:

full join