gpt4 book ai didi

c++ - 将 do-while 循环压缩为 #define 宏

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:24 24 4
gpt4 key购买 nike

考虑以下示例代码(我实际上使用的是更长的二进制字符串,但这足以说明问题):

  void enumerateAllSubsets(unsigned char d) {
unsigned char n = 0;
do {
cout<<binaryPrint(n)<<",";
} while ( n = (n - d) & d );
}

该函数(由于 Knuth)有效地循环了二进制字符串的所有子集;

例如:

33 = '00100001' in binary and enumerateAllSubsets(33) would produce:

00000000, 00100000, 00000001, 00100001.

我需要写一个#define 来实现

   macroEnumerate(n,33)
cout<<binaryPrint(n)<<",";

行为方式等同于 enumerateAllSubsets(33)。 (好吧,顺序可能会重新排列)

基本上,我需要能够对集合的子集执行各种操作。

用 for 循环做类似的事情是微不足道的:

for(int i=0;i < a.size();i++)
foo(a[i]);

可以替换为:

 #define foreach(index,container) for(int index=0;index < container.size();index++)
...
foreach(i,a)
foo(a[i]);

enumerateAllSubsets() 的问题在于循环体需要无条件执行一次,因此 do-while 不能像 for 一样重写。

我知道这个问题可以通过 STL 风格的模板化函数和传递给它的 lambda 来解决(类似于 STL for_each 函数),但是一些坏蛋 #define 宏似乎是一个更干净的解决方案。

最佳答案

假设使用 C++11,定义一个范围对象:

#include <iostream>
#include <iterator>
#include <cstdlib>

template <typename T>
class Subsets {
public:
Subsets(T d, T n = 0) : d_(d), n_(n) { }
Subsets begin() const { return *this; }
Subsets end() const { return {0, 0}; }

bool operator!=(Subsets const & i) const { return d_ != i.d_ || n_ != i.n_; }

Subsets & operator++() {
if (!(n_ = (n_ - d_) & d_)) d_ = 0;
return *this;
}

T operator*() const { return n_; }

private:
T d_, n_;
};

template <typename T>
inline Subsets<T> make_subsets(T t) { return Subsets<T>(t); }

int main(int /*argc*/, char * argv[]) {
int d = atoi(argv[1]);
for (auto i : make_subsets(d))
std::cout << i << "\n";
}

如果您想使用,例如 uint64_t,我已将其设置得非常通用。

关于c++ - 将 do-while 循环压缩为 #define 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20823203/

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