gpt4 book ai didi

c++ - 如何将此 for 循环更改为 for_each 循环?

转载 作者:行者123 更新时间:2023-11-30 04:31:12 25 4
gpt4 key购买 nike

如何将其转换为 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”作为“virtual bool rectangle::inside_window(const std::complex&, const std::complex&)”的“this”参数赋值会丢弃限定符 [-fpermissive]

编辑:在 window() 内

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;
}

最佳答案

您需要将 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() 中。

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

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()));
}

或者作为 lambda:

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 来建模点。自定义结构在语义上更合适:

// A basic mutable 2D double vector.
struct point {
double x, y;
};

关于c++ - 如何将此 for 循环更改为 for_each 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8335328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com