在整数范围内调用STL算法有什么好办法吗?
例如,我有一个集合“col”,只能通过GetElement(int)方法访问它的元素。是否可以使用find_if函数在该集合中查找内容?
我想这样说:
auto element =
find_if(0, col.Size(), [&col] (int i) {
return predicate(col.GetElement(i));
});
我正在寻找STL或任何其他图书馆解决方案。
答案 0 :(得分:3)
使用标准C ++?是的,如果你编写一个自定义元素迭代器。然后,您的代码很容易简化为:
auto element = find_if(col.begin(), col.end(), predicate);
<小时/> 使用标准库不可能做出更接近你的想法,但它是Boost,它是一个你应该拥有的令人难以置信的C ++库。 Boost有一个计数迭代器:http://www.boost.org/doc/libs/1_55_0/libs/iterator/doc/counting_iterator.html
如何使用std :: copy()填充数字为0到100的向量?内置整数类型中唯一缺少的迭代器操作是operator *(),它返回整数的当前值。计数迭代器适配器将这个至关重要的功能添加到它包装的任何类型。可以使用计数迭代器适配器,不仅可以使用整数类型,还可以使用任何可递增类型。
#include <boost\counting_iterator.hpp> //or something, not sure of exact header
int main() {
boost::counting_iterator<int> first(0);
boost::counting_iterator<int> last(col.Size());
auto element = find_if(first, last, [&col](int i) {return predicate(col.GetElement(i);});
}
另外,提升也有范围。他们在完全的情况下并没有真正帮助你,但它有关系,所以我会提到它:
#include <boost\range\irange.hpp>
int main() {
for (int index: boost::range::irange<int>(0, col.Size()) )
{
std::cout << element; //counts from 0 to col.Size()
}
}