我正在研究一个函数,如果任何一个点位置在定义的矩形边界之外,它应该返回false。
我目前的c ++代码如下:
bool trackingPointsVisible(){
//I've got 4 points here
if(!points.empty()){
// loop through each of the points
for(int i=0; i<points.size(); i++){
//check if points' x and y positions are out of the boundaries
if(points[i].x < -60 || points[i].x > 300 ||
points[i].y < -60 || points[i].y > 300){
// if any of them are out return false
return false;
}else{
//if they're within the boundaries, return true
return true;
}
}
}
}
由于某种原因,即使其中一个点超出指定的边界,它也会返回true
。我不认为应该是这种情况。我应该重写这个功能并单独检查每个点还是有另一种方法?
有人可以指出我在这里做错了什么吗?感谢。
答案 0 :(得分:5)
您根据第一点的检查返回,而不继续检查任何其他点。如果在区域外找到一个点,则应返回false,否则继续检查剩余的点,仅在循环外返回true。
无论它值多少,你都可以简化代码:
bool trackingPointsVisible()
{
for (const auto& point : points)
//check if points' x and y positions are out of the boundaries
if (point.x < -60 || point.x > 300 ||
point.y < -60 || point.y > 300)
return false;
return true;
}
...或者,更具声明性......
bool trackingPointsVisible()
{
// check none of the points are out of bounds...
return std::none_of(std::begin(points), std::end(points),
[](const Point& point) {
return point.x < -60 || point.x > 300 ||
point.y < -60 || point.y > 300;
});
}
答案 1 :(得分:1)
首先,该函数具有未定义的行为,因为在容器points
为空时它不返回任何内容。
其次,只有在检查了所有点时才必须返回true。那就是true的return语句必须在循环之外。
可以通过以下方式定义该功能。
bool trackingPointsVisible()
{
//I've got 4 points here
size_t i = 0;
while ( i < points.size() and not
( points[i].x < -60 || points[i].x > 300 ||
points[i].y < -60 || points[i].y > 300 ) ) i++;
return i == points.size();
}
声明
size_t i = 0;
可以替代
decltype( points )::size_type i = 0;
例如
bool trackingPointsVisible()
{
//I've got 4 points here
decltype( points )::size_type i = 0;
while ( i < points.size() and not
( points[i].x < -60 || points[i].x > 300 ||
points[i].y < -60 || points[i].y > 300 ) ) i++;
return i == points.size();
}
答案 2 :(得分:1)
只能在函数末尾返回true:
bool trackingPointsVisible(){
//I've got 4 points here
if(!points.empty()){
// loop through each of the points
for(int i=0; i<points.size(); i++) {
//check if points' x and y positions are out of the boundaries
if(points[i].x < -60 || points[i].x > 300 ||
points[i].y < -60 || points[i].y > 300) {
// if any of them are out return false
return false;
}
}
}
return true;
}