使用模式创建 2^n 个变量

Create 2^n variables with a pattern

我想用一段代码创建 2^n 个变量,如下 属性:

如果n=1,变量应该被命名 n0 n1

如果n=2,变量应该被命名 n00 n01 n10 n11

如果n=3,变量应该被命名 n000 n001 n010 ..

n 的最大值是有界的并且是已知的,所以不用担心。 位和变量应该按顺序排列。

我正在考虑创建一个包含 2^n 个元素的数组,然后逐个操作 2^n 位并附加到 n。这似乎是一个琐碎而冗长的解决方案。有没有更优雅的方式? C 或 C++ 适合我。

没有理由手动命名数百或数千个变量,只需使用一个数组:

#include <stdlib.h>

int main(int argc, char **argv) {
        int n = 10;
        /* static */
        int a[1<<n];

        /* dynamic */
        size_t bsize = 1<<n; /* 1024 */
        int *b = malloc(bsize * sizeof(int)); /* 1024 ints */

        return 0;
}

如果您想创建一段包含许多不同名称的不同变量的代码,我建议您开始编写自己的代码生成器。下面的代码应该是一个好的开始。

#include <sstream>
#include <iostream>
#include <string>
#include <vector>

namespace {
template <typename Function>
void bitExecutor(int nrOfBits, std::vector<bool> &bits, const Function &f) {
  if (nrOfBits) {
    bits.push_back(false);
    bitExecutor(nrOfBits - 1, bits, f);
    bits.back() = true;
    bitExecutor(nrOfBits - 1, bits, f);
    bits.pop_back();
  } else {
    f(bits);
  }
}
}

int main(int argc, char **argv) {
  int nrOfBits = 4; // Let's assume runtime init

  std::vector<std::string> values;
  std::vector<bool> bits;
  bitExecutor(nrOfBits, bits, [&values](std::vector<bool> &bits) {
    std::string buffer;
    buffer += "n";
    for (auto &&bit : bits) {
      if (bit)
        buffer += "1";
      else
        buffer += "0";
    }
    values.emplace_back(std::move(buffer));
  });

  for (const auto &value : values)
    std::cout << value << std::endl;
  return 0;
}

就是说,我认为您在这里试图解决错误的问题。为什么要有很多变量代表相同的东西,而你可以使用像 std::vector 这样的东西,它完全适用于索引。另请参阅此示例中的 'values' 变量,您可以像 values[0] // first element 一样对其进行索引 ... 并获取匹配值