使用模式创建 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
一样对其进行索引 ... 并获取匹配值
我想用一段代码创建 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
一样对其进行索引 ... 并获取匹配值