[英]C++ - Iterating over std::vector<> returned from find_if
我正在学习 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;
}
本示例打印第一个奇数值。 我怎样才能扩展它来为我提供myvector
每个奇数值的索引值? 这是正确的方法吗?
// 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
请参阅@David Rodríguez - 下面的 dribeas 评论。
您可以增加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);
现在结果包含奇数值。 (注意后面的:inserter 在<iterator>
头中)
您可以通过减去序列的开头来找到向量迭代器(以及更一般的任何随机访问迭代器)的索引:
std::cout << "The index is " << (it - myvector.begin()) << '\n';
更普遍的是,有一个std::distance
函数可以为您提供前向迭代器之间的距离。 例如,如果您的容器是一个list
,您可以使用它; 但您可能不想这样做,因为它会慢得多。
要查找所有奇数,您需要一个循环来再次调用find
,从刚找到的元素之后的元素开始。
你需要一个循环。 标准库的迭代器算法设计使这变得非常简单:
#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";
}
更改这两行:
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);
}
一个不错的紧凑解决方案可能是:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector<int> const v{1,4,9,11,2,7,8};
std::cout << "Odd values at indices";
for(auto b=begin(v), i=b, e=end(v);
(i=find_if(i,e,[](int a){return a%2==1;})) != e;
++i)
std::cout << ' ' << distance(b,i);
std::cout.flush();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.