今天早些时候我提出了一个关于获得所有可能组合的问题,并且我对使用二进制循环给出了一个很好的暗示,在对它进行了一些思考后,我在C ++中提出了以下代码:
vector<bool>binary(size,0);
bool filled=false;
while(filled==false)
{
bool setdigit=true;
for(int k=0;k<size;k++)
{
if(setdigit==true)
{
if(binary[k]==false)
{
binary[k]=true;
setdigit=false;
}
else //when the digit is already true
{
binary[k]=false;
}
}
}
for(int i=0;i<size;i++)
{
if(binary[i]==false)
{
filled=false;
break;
}
else filled=true;
}
}
代码似乎有效,但测试二进制增量是否完成的方法编码非常糟糕,我应该如何改进退出条件甚至循环过程?
答案 0 :(得分:4)
伪代码:
for (i=0;i<2^size;i++)
binary = std::bitset(i); /* the bits of i are the bits you are looking for */
答案 1 :(得分:1)
你的setdigit
没用。
您可以删除它,删除条件,并通过break
将赋值替换为false。
所以循环将是
for(int k = 0; k < size; k++)
{
if (binary[k] == false)
{
binary[k] = true;
break;
}
else // when the digit is already true
{
binary[k] = false;
}
}
然后,您可以更改while (filled /* has only true */)
通过do {} while(binary_is_false /* has only false */)
允许直接在增量内部进行检查。
您最终可能会将代码拆分为函数以获取类似:(https://ideone.com/dmQwFc)
bool increase(std::vector<bool>& v)
{
for (std::size_t i = 0; i != v.size(); ++i) {
v[i] = !v[i];
if (v[i] == true) {
return true;
}
}
return false; // v contains only false values now.
}
int main()
{
std::vector<bool> v(5);
do {
// Do some job as printing vector content:
for (std::size_t i = 0; i != v.size(); ++i) {
std::cout << v[i] << " ";
}
std::cout << std::endl;
} while (increase(v));
return 0;
}
答案 2 :(得分:0)
您可以更改代码:
for(int i=0;i<size;i++)
{
if(binary[i]==false)
{
filled=false;
break;
}
else filled=true;
}
通过
filled = (find(binary.begin(), binary.end(), false) == binary.end())
您需要为此工作添加<algorithm>
。