假设我有以下输入向量
vector<string> variables = { "A", "B", "C", "D" };
vector<string> operators = { "+" };
因此,我希望获得这些变量之间所有不同的运算符排列。变量始终位于固定位置-只有操作员会更改。
对于先前的输入向量,我需要具有以下输出:
A + B + C + D
这很简单,因为只有一个运算符可用(“ +”)。但是,如果我有以下输入向量:
vector<string> variables = { "A", "B", "C", "D" };
vector<string> operators = { "+", "-" };
然后需要以下输出:
A + B + C + D
A - B + C + D
A + B - C + D
A + B + C - D
A - B - C + D
A + B - C - D
A - B + C - D
A - B - C - D
现在,我有了这些运算符在变量之间的所有可能变体。
到目前为止,我编写了以下函数
template<class T>
vector<vector<T> > getAllPermutations(vector<T> input) {
vector<vector<T> > res;
do {
vector<T> current_vector;
for (T index : input)
current_vector.push_back(index);
res.push_back(current_vector);
} while (next_permutation(input.begin(), input.end()));
return res;
}
但是这只能解决部分问题,因为我不知道每次需要调用此函数时如何生成正确的输入向量。
如何解决?
[如果您将operators
的大小看成是一个数字基数,而将variables
的大小看成一个数字(由基数表示),则可能会有所帮助。因此,对于您使用"+"
和"-"
的示例,您有两个operators
,这意味着基数是2
,这很简单,因为它是二进制算术。如果您有四个operators
(通过添加例如"*"
和"/"
),则基数为4
。您使用基数创建的数字中的“数字”数(以您的示例为准)为variables.size() - 1
或3
。