我想用一段代码创建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 ++对我没问题。
答案 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
...并获取匹配值