如何将for循环更改为for_each循环?

时间:2011-12-01 01:04:39

标签: c++

如何将其转换为for_each循环?

template <typename Container>
void draw_all(const Container &c, const rectangle &w)
{
    complex<double> bl, tr;
    bl = w.get_bl();
    tr = w.get_tr();

    for (typename Container::const_iterator p= c.begin(); p != c.end(); p++)
    {
        if((*p)->inside_window(bl,tr))
            (*p)->draw();
    }
}

我正在尝试:for_each(c.begin(), c.end(), w.inside_window(w.get_bl(),w.get_tr()));

我得到错误:将'const rectangle'作为'this'参数'virtual bool rectangle :: inside_window(const std :: complex&amp;,const std :: complex&amp;)'丢弃限定符[-fpermissive]

编辑:在窗口内()

bool rectangle::inside_window(const complex<double> &_bl, const complex<double> &_tr)
{
    if(_bl.real() > bl.real() || _tr.real() > tr.real() || _bl.imag() > bl.imag() || _tr.imag() > tr.imag())
    {
        return false;
    }
    else
        return true;

    cout.flush();
}

的for_each():

template<typename InputIter, typename UnaryFunction>
UnaryFunction for_each(InputIter first, InputIter last, UnaryFunction fn)
{
    while (first != last)
        fn(* first++); // Increment first but dereference its old value.
    return fn;
}

3 个答案:

答案 0 :(得分:2)

您需要将rectangle::inside_window()声明为const方法:

virtual bool inside_window(const std::complex&, const std::complex&) const;
                                                                  // ^^^^^

这样this类型const rectangle*而不只是rectangle*,这允许在inside_window()上调用const rectangle,因为它必须位于for_each() {1}}。

但是,你的逻辑是有缺陷的:如果你想测试 inside_window()的结果并有条件地调用draw(),那么{{1}的唯一方法就是这样做使用辅助方法,或者作为仿函数:

for_each()

或作为一个lambda:

struct draw_visible : public std::unary_function<rectangle, void> {

    const std::complex<double> bl, tr;

    draw_visible(const std::complex<double>& bl, const std::complex<double> tr)
        : bl(bl), tr(tr) {}

    void operator()(const rectangle& r) const {
        if (r.inside_window(bl, tr))
            r.draw();
    }

};

template<class Container>
void draw_all(const Container& c, const rectangle& w) {
     std::for_each(c.begin(), c.end(), draw_visible(w.get_bl(), w.get_tr()));
}

此外,您可能不应该使用template<class Container> void draw_all(const Container& c, const rectangle& w) { std::for_each(c.begin(), c.end(), [&w](const rectangle& r) { if (r.inside_window(w.get_bl(), w.get_tr()) r.draw(); }); } 来模拟点数。自定义结构在语义上更合适:

std::complex

答案 1 :(得分:0)

只是一个猜测,但我会说inside_window不是const方法,这就是你得到那个错误的原因。你能告诉我们代码吗?

你已经宣布p为const,这意味着你承诺不使用它来改变任何东西。但是你的inside_window()方法不承诺不这样做,因此编译说你不尊重这个承诺。 make inside_window const,这应该消失(如果确实你没有改变该方法内的任何东西,那么这将是一个简单的修复)

答案 2 :(得分:0)

for_each的第三个参数需要是一个函数。更具体地说,一个函数接收*p并为你的循环做主体

/* function or method */ (const Container& c){
   if(c->inside_window(cl, tr))
     c->draw();
}

但请注意我们如何跟踪cltr for out功能。这项工作的方法是使函数成为operator ()cl作为实例变量的对象的tr重载。

class Drawer{
    complex<double> bl, tr;
    Drawer(/*constructor parameters, probably w*/){ /*...*/}
    void operator() (const Container& c){ /*...*/ }
};

for_each(c.begin(), c.end(), Drawer(w));