我有一个相对简单的算法,它会遍历std :: vector,寻找两个相邻的元组。一旦找到X值左右两侧的元组,我就可以在它们之间进行插值。不知何故,这有效:
std::vector<LutTuple*>::iterator tuple_it;
LutTuple* left = NULL;
LutTuple* right = NULL;
bool found = 0;
// Only iterate as long as the points are not found
for(tuple_it = lut.begin(); (tuple_it != lut.end() && !found); tuple_it++) {
// If the tuple is less than r2 we found the first element
if((*tuple_it)->r < r) {
left = *tuple_it;
}
if ((*tuple_it)->r > r) {
right = *tuple_it;
}
if(left && right) {
found = 1;
}
}
虽然:
std::vector<LutTuple*>::iterator tuple_it;
LutTuple* left = NULL;
LutTuple* right = NULL;
// Only iterate as long as the points are not found
for(tuple_it = lut.begin(); tuple_it != lut.end() && !left && !right; tuple_it++) {
// If the tuple is less than r2 we found the first element
if((*tuple_it)->r < r) {
left = *tuple_it;
}
if ((*tuple_it)->r > r) {
right = *tuple_it;
}
}
没有。这是为什么?我希望像这样的两个NULL pt在被否定时一起评估为真。
答案 0 :(得分:5)
第二个循环将在找到任何一个循环后立即终止。将条件更改为:
tuple_it != lut.end() && !(left && right)
或
tuple_it != lut.end() && (!left || !right)
继续,直到找到它们。
答案 1 :(得分:4)
存在一个逻辑问题。
在您的第一个片段中(基本上)!(left && right)
。
在第二个代码段中,您有!left && !right
。
那些不等同。
如果您构建真值表,您会发现!(left && right)
等同于(!left || !right)
。
答案 2 :(得分:0)
我希望像这样的两个NULL pt一起评估为true 否定。
这没有意义。不要“否定”指针并期望在强制进入布尔表达式时它们将评估什么。相反,我建议明确地将它们与NULL进行比较。
另外,移动复杂的布尔表达式以使循环继续进入单独的行,否则很难在逻辑上遵循代码。