【问题标题】:Create 2^n variables with a pattern使用模式创建 2^n 个变量
【发布时间】:2016-08-17 01:48:29
【问题描述】:

我想用一段代码创建 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++ 适合我。

【问题讨论】:

  • n的最大值是多少??
  • 它不是很清楚你在问什么。要“创建 2^n 个变量”,计算 x = 2^n 然后std::vector<T> vect = std::vector<T>(x); 向量中的变量存储在连续内存中
  • 这不太有意义,你需要变量还是值?您需要具有特定值的变量吗?顺便说一句,你只是在这里数。
  • @JVApen malloc 仍然是在当前版本的 C 中使用的合适函数。责备 OP 进行双重标记,不要责怪响应的人选择了没有的标记您的个人喜好。
  • @zorro 变量纯粹是一个编译时概念。 n 是编译时常量吗?否则你不能动态地创建变量。您可以动态创建对象,但它们不会有变量名。

标签: c++ c variables bits


【解决方案1】:

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

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

【讨论】:

  • 如果您不必担心内存管理, const static auto size = 1 &lt;&lt; 10; std::array&lt;int, size&gt; a; 将是 c++ 变体。 (静态)或std::vector&lt;int&gt; v; v.resize(size);(动态)
  • @JVApen 首选constexpr
  • 我同意,constexpr 会更好,虽然我还不能正确使用它。 (VS2013 限制)
【解决方案2】:

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

#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 ... 一样对其进行索引并获取匹配的值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多