将C++标准库算法应用于函数

3
有没有一种方法可以将非修改的标准库算法应用于离散函数而不是容器?
例如,请考虑以下函数:
int sqr(int i)
{
    return i*i;
}

我该如何使用std::find或者std::lower_bound来查找值为49的元素,使得算法返回7?最简单的方式是将集合中的元素放入向量中,并对向量应用算法,但是这显然效率低下。


2
@AmiTavory:无边界范围迭代器并不罕见,例如std::istream_iterator<T>(std::cin)。如果你真的想要搜索整数,你可以构建这样一个迭代器。 - Kerrek SB
好的,我同意 @paddy 的观点,一个不基于迭代器的数值库可能更适合这种情况。尽管如此,还是有可能实现(下面写了一些内容)。 - Ami Tavory
@KerrekSB 这不需要太多的代码:你可以在一个 boost 计数迭代器上添加一个 boost 迭代器外观,以获得一个 aleph-ephes 枚举器(当与一个具体数字迭代器进行比较时,特殊的“结束”迭代器将被评估为 false)。 - Ami Tavory
@AmiTavory:我的最大概念性反对意见是,这将“find”转变为一个可能无法终止的部分函数。因此,对于真正的计算机程序来说,这可能不是正确的方法。 - Kerrek SB
@AmiTavory Aleph Naught是一个基数。迭代器必须是序数。必须传递omega。 - user58697
显示剩余4条评论
1个回答

5
理论上,你可以使用类似于boost::iterator::counting_iterator的东西。例如,下面的代码会找到使16的平方是4的数:
#include <algorithm>                                                                                                                                                                                         
#include <iostream>

#include <boost/iterator/counting_iterator.hpp>


using namespace std;


int main(int, char**)
{

    auto f = std::find_if(
        boost::make_counting_iterator<int>(0),
        boost::make_counting_iterator<int>(20),
        [](int i){return i * i == 16;});
    cout << std::distance(
        boost::make_counting_iterator<int>(0),
        f) << endl;

    return 0;
}

我认为这种方法从多个方面来看都存在问题。特别是在上述内容中,需要注意的是它搜索的数字只到20。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接