如果数组中的所有值都为真,则退出函数
Quitting a function if all values in an array are true
有一个简单的功能我想添加到 class 的成员之一:我想退出函数以防某些布尔 (2d) 数组的所有值都是 true
.
在更简单的一维数组的情况下,我可以这样做:
int SIZE = 10;
std::vector<bool> myArray(SIZE, true);
int i = 0;
while(myArray[i] and i < SIZE){
++i;
}
if(i == SIZE){
return;
}
// rest of the code for array not all true
可能没有更快的方法(减去边际优化),但我觉得它有点难看。有更好的方法吗?
=========================================
最后我决定执行:
{
bool allTrue = true;
for(int i = 0; i < SIZE1 and allTrue; ++i)
for(int j = 0; j < SIZE2 and allTrue; ++j)
allTrue &= myArray[i][j];
if(allTrue)
return;
}
您可以使用 <algorithm>
中的 std::all_of
:
if (std::all_of(myArray.begin(), myArray.end(), [](bool b) {return b;})) {
return;
}
可能是所有值的and-ing?这样:
bool r = true;
for (int i=0; i<myArray.size() && r; i++) r &= myArray[i];
return r;
或者 std::all_of
如果您熟悉迭代器和 lambda。
对于二维向量,您可能希望将其分解:
#include <vector>
#include <algorithm>
bool all_true(const std::vector<bool>& v)
{
return std::all_of(std::begin(v), std::end(v), [](const auto& b) { return b; });
}
bool all_true(const std::vector<std::vector<bool>>& vv)
{
return std::all_of(std::begin(vv), std::end(vv), [](const auto& v) {
return all_true(v);
});
}
void test()
{
std::vector< std::vector< bool > > d2 /* = initalise 2d vector */;
while(!all_true(d2))
{
// things you want to do
}
}
解决方案之一:
int my2Da[][2] = {{true, true},{true, true},{true, true}};
int *pa = my2Da[0];
bool flag=true;
for (int i=0;flag && i<(sizeof my2Da)/(sizeof (int));flag &= pa[i++]);
//flag indicates about the result
有一个简单的功能我想添加到 class 的成员之一:我想退出函数以防某些布尔 (2d) 数组的所有值都是 true
.
在更简单的一维数组的情况下,我可以这样做:
int SIZE = 10;
std::vector<bool> myArray(SIZE, true);
int i = 0;
while(myArray[i] and i < SIZE){
++i;
}
if(i == SIZE){
return;
}
// rest of the code for array not all true
可能没有更快的方法(减去边际优化),但我觉得它有点难看。有更好的方法吗?
=========================================
最后我决定执行:
{
bool allTrue = true;
for(int i = 0; i < SIZE1 and allTrue; ++i)
for(int j = 0; j < SIZE2 and allTrue; ++j)
allTrue &= myArray[i][j];
if(allTrue)
return;
}
您可以使用 <algorithm>
中的 std::all_of
:
if (std::all_of(myArray.begin(), myArray.end(), [](bool b) {return b;})) {
return;
}
可能是所有值的and-ing?这样:
bool r = true;
for (int i=0; i<myArray.size() && r; i++) r &= myArray[i];
return r;
或者 std::all_of
如果您熟悉迭代器和 lambda。
对于二维向量,您可能希望将其分解:
#include <vector>
#include <algorithm>
bool all_true(const std::vector<bool>& v)
{
return std::all_of(std::begin(v), std::end(v), [](const auto& b) { return b; });
}
bool all_true(const std::vector<std::vector<bool>>& vv)
{
return std::all_of(std::begin(vv), std::end(vv), [](const auto& v) {
return all_true(v);
});
}
void test()
{
std::vector< std::vector< bool > > d2 /* = initalise 2d vector */;
while(!all_true(d2))
{
// things you want to do
}
}
解决方案之一:
int my2Da[][2] = {{true, true},{true, true},{true, true}};
int *pa = my2Da[0];
bool flag=true;
for (int i=0;flag && i<(sizeof my2Da)/(sizeof (int));flag &= pa[i++]);
//flag indicates about the result