使用具有整数范围的算法

时间:2014-06-09 18:09:50

标签: c++

在整数范围内调用STL算法有什么好办法吗?

例如,我有一个集合“col”,只能通过GetElement(int)方法访问它的元素。是否可以使用find_if函数在该集合中查找内容?

我想这样说:

auto element = 
        find_if(0, col.Size(), [&col] (int i) { 
            return predicate(col.GetElement(i));
        });

我正在寻找STL或任何其他图书馆解决方案。

1 个答案:

答案 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()
    }
}