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

时间:2016-04-23 12:07:49

标签: c++ c variables bits

我想用一段代码创建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 ++对我没问题。

2 个答案:

答案 0 :(得分:2)

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

#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;
}

答案 1 :(得分:1)

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

#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 ...并获取匹配值