3

在 C++ 中定义分段函数的最佳方法是什么,例如在使用样条曲线时需要?

例子:

        f1(x) if x from [0, 5)
f(x) =  f2(x) if x from [5, 10)
        f3(x) if x from [10, 20)

我目前的方法如下所示:

class Function
{
    virtual double operator()( double x ) = 0;
}

class SomeFun : public Function
{
   // implements operator() in a meaningful way
}

class PiecewiseFunction : public Function
{
    // holds functions along with the upper bound of the interval
    // for which they are defined
    // e.g. (5, f1), (10, f2), (20, f3)
    std::map< double, Function* > fns;

    virtual double operator()( double x )
    {
       // search for the first upper interval boundary which is greater than x
       auto it = fns.lower_bound( x );
       // ... and evaluate the underlying function.
       return *(it->second)(x);
    }
}

这种方法缺乏检查是否x在函数的整体范围内,例如上面示例中的 [0, 20),我知道,也许命名不是最好的(Functionvs.std::function等等)。

任何想法如何以更聪明的方式做到这一点?该方法使用要在 a 中排序的键的属性std::map。这与效率无关,更多的是关于简洁的设计。

切片

不完全是问题的一部分,但在其中一条评论中提到了切片,在这里你可以阅读它。

std::map 无法处理多态性?

我在上面的代码中更正了这一点。

4

1 回答 1

1

当前设计的一个问题是,它不允许最自然地认为在某些间隔或点(如 0)上未定义的函数,但是这些函数有很多,因此它是范围检查的另一个动机。还Function需要替换为Function*需要在语法上进行一些其他更改。

class PiecewiseFunction : public Function
{
    //Holds function and interval
    std::map< std::pair<double,double>, Function* > fns;

   double operator()( double x )
   {
           auto iter = std::find_if(fns.cbegin(), fns.cend(), 
                             [=](const std::pair< std::pair<double,double>, Function*>& fn) 
                             {  
                                return x>=fn.first.first &&  x<fn.first.second; 
                             });

       if (iter == fns.end()) throw... //Or something
       return (*iter->second)(x);
    }
};
于 2013-05-25T22:54:13.053 回答