我可以在这里摆脱嵌套的循环吗?
Can I get rid of nested for loops here?
我有一个函数,它接受一个向量,并通过组合其中的所有元素来返回一个向量。现在,我有 3 个嵌套的循环,可以创建一个 3 级深的组合。我希望它看起来更好,并且能够在需要时添加功能以使其深度为 4 级。
如果输入 = ["一"、"二"、"三"]
3级输出="一二三"二一三"等。
std::vector<std::string> generator(std::vector<std::string>& x)
{
std::vector<std::string> output;
std::string tmp;
for (auto i : x) {
output.push_back(i);
for (auto j : x) {
tmp = i + j;
output.push_back(tmp);
for (auto k : x) {
tmp = i + j + k;
output.push_back(tmp);
}
}
}
return output;
}
我已经研究了迭代器,但我无法弄清楚它是否有效。
如果您正在寻找的是简单地生成字符串向量x
的所有元素的排列,并将这些排列存储到另一个输出向量中,这可以通过使用 std::next_permutation 和 std::accumulate 轻松实现:
#include <vector>
#include <string>
#include <numeric>
#include <iostream>
#include <algorithm>
std::vector<std::string> generator(std::vector<std::string> x)
{
std::vector<std::string> output;
std::sort(x.begin(), x.end());
do
{
output.push_back(std::accumulate(x.begin(), x.end(), std::string()));
} while (std::next_permutation(x.begin(), x.end()));
return output;
}
int main()
{
auto v = generator({"one","two","three"});
for (auto& val : v)
std::cout << val << "n";
}
现场示例
默认情况下,std::accumulate
基本上对元素调用operator +
,因此字符串会自动连接。
就std::next_permutation
而言,链接中解释了它的功能。 基本上,您希望从排序序列开始,并调用std::next_permutation
以获取元素的下一个排列。
请注意,这并不取决于"级别"的数量(正如您所说的那样)。 你可以有一个 10 个字符串的向量,这将正常工作(假设没有内存限制)。
如果你想生成最大长度为 L 的 N 个单词的所有组合,你可以使用这个:
std::vector<std::string> generator(const std::vector<std::string> & x, int levels) {
int nWords = x.size();
std::vector<std::string> output;
for (int l = 1; l <= levels; ++l) {
int nCombs = std::pow(nWords, l);
for (int i = 0; i < nCombs; ++i) {
std::string cur;
for (int j = 0, k = i; j < l; ++j) {
cur += x[k%nWords];
k /= nWords;
}
output.push_back(cur);
}
}
return output;
}
现场示例
仍然有 3 个嵌套循环,但这适用于 L 的任何值 - 而不仅仅是 3。L> N 也有效。
我曾经在 Python 中遇到过类似的问题。
我想的目标是有一个"n
嵌套"循环,这样n
就是一个变量。更好的结果是使级别i
的每个索引I_i
都是变量。也就是说,给定一个列表[I_1,I_2,...,I_n]
,你应该能够生成这样的循环
for i_1 in range( I_1):
for i_2 in range( I_2):
...
for i_n in range(I_n):
some_function(i_1,i_2,...,i_n)
一种方法是使用数学。您可以构建一个数字,以便在第 i
位数字上,它是基于I_i
的。这个数字的最大值只是 I_1*I_2*...*I_n
.这样,整个循环将被折叠成一个简单的循环
for i in range(I_1*I_2*...*I_n):
# obtain these numbers
i_1 = f_1(i)
i_2 = f_2(i)
...
i_n = f_n(i)
some_function(i_1,i_2,...,i_n)
虽然获取i
的功能有点复杂。
正如您所提到的,另一种方法是迭代器。在Python中,它只是import itertools
。然而,在C++,我发现了这个cppitertools。我还没有尝试过,但我想这可以工作。
不过,如果你想要速度,第一个方法更受欢迎。不过,我认为有更好的解决方案。
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 嵌套for循环C++的问题(初学者)
- 嵌套While循环不起作用(C++问题)
- 无法掌握嵌套循环的写作技巧
- 嵌套的 for 循环不循环通过第二个数组
- 在 c++ 中实现嵌套循环的更短方法吗?
- 嵌套在循环中的两个循环的 big-O 表示法
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 具有嵌套 if-else 的循环的时间复杂度
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 如何编写嵌套的 for 循环
- 如何在C++中创建 if else 循环而不是多个嵌套?
- 迭代嵌套映射与范围为循环:没有名为"first"的成员
- 为循环嵌套的变量快速生成数字组合
- 为循环嵌套的C++压缩
- 为循环嵌套的变量
- 使用foreach循环嵌套的QHash