【问题标题】:C++ Function that takes an array, a predicate and a operator as arguments and apply the operator to array's element where predicate is satisfied将数组、谓词和运算符作为参数并将运算符应用于满足谓词的数组元素的 C++ 函数
【发布时间】:2020-05-28 22:41:49
【问题描述】:

我正在尝试编写标题中描述的函数。 我制作了一个名为 queue 的模板自定义动态数组,如果满足参数传递的谓词,我需要创建一个函数来检查该队列的每个元素;如果是,我需要将运算符应用于该元素也通过参数传递。

首先我可能需要一个解释..谓词应该是一元的,所以它可能是“isdigit”或“isalpha”之类的东西,对吧?作为运算符,它可能是一个简单的后增量++。 主要问题是我真的不知道如何将运算符和谓词作为函数中的参数传递。

如果我理解了这个请求,这里我尝试做的但当然没有工作......有人帮忙吗?

template<typename L, typename OPERATOR>

void change_if(queue<L> &que, bool (*f)(L), OPERATOR op) {

    for(int i=0; i<que._size-1; i++) {
        if ((*f)(que._queue[i]))
            que._queue[i] = op(que._queue[i]);
    }
}

int main(){
    //as constructor, 3 is referred to size of the queue and 99 to the values.
    queue<int> q(3, 99);

    change_if(q, isdigit, ++);

}

【问题讨论】:

  • 什么不起作用?程序是否编译?它会给出错误的输出吗?此外,如果您不确定如何将谓词和运算符传递给函数,请尝试使用普通数组或vector,然后再尝试自定义数组。
  • 作为示例运算符,您给出后增量 ++,但后增量运算符在此处不会产生预期效果que._queue[i] = op(que._queue[i]);
  • 您不能在任何地方传递运算符,您需要将它们包装在某种可调用对象中。

标签: c++ function c++11 templates predicate


【解决方案1】:

首先我建议也使用推断类型传递谓词,因此您也可以传递 lambda,即

template<typename L, typename P, typename OP>
void change_if(queue<L> &que, P pred, OP op) {
  for(...)
    if(pred(que._queue[i]))
       que._queue[i] = op(que._queue[i]);
}

您的想法有点不一致,因为您执行了赋值 (que._queue[i] = op(que._queue[i]);),然后提出 op 应该类似于后自增运算符的想法。
两者一起归结为a = a++,这没有任何效果。

你可以选择以下两种方式之一:

  1. 将“op”视为一个函数,获取一个元素并返回一个更改后的元素,即L op(const L&amp;l) { return l+1; }。然后使用上面的代码并调用
    change_if(q, [](auto &amp;&amp; l) { return std::isdigit(l); }, [](auto &amp;&amp; l) { return l + 1});
  2. 将“op”视为一个函数,改变它得到的元素,即void op(L&amp;l) { l++;}。然后使用if(pred(...)) op(que._queue[i]) 并调用
    change_if(q, [](auto &amp;&amp; l) { return std::isdigit(l); }, [](auto &amp;&amp; l) { l++; });

附带说明:您不能简单地获取std::isdigit 的地址,因为它已超载,因此我在此处将调用包装在 lambda 中。

另一个说明:我不知道您的队列实现,但 for 循环条件中的 &lt; size-1 看起来有点像您缺少最后一个元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 2018-11-06
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多