我将字符串存储在一个 vector 中:vector<string> ex = {"ab", "cd", "ef"}
.
现在我需要创建这些字符串的笛卡尔积( vector 中字符串的数量,字符串的长度也不固定!)。结果应该是:
ace
acf
ade
adf
bce
bcf
bde
bdf
是否已经存在用于此的内置函数,或者您对如何执行实现有任何建议?
字符串的单个字母应该用于笛卡尔积而不是整个字符串!
最佳答案
我可以使用图书馆提供这种方式 https://cpplinq.codeplex.com/
#include <iostream>
#include <vector>
# include <algorithm>
# include <iterator>
# include <string>
# include <tuple>
# include <functional>
# include <cmath>
#include "cpplinq.hpp"
using namespace cpplinq;
std::vector<std::string> simpleTransform(const std::vector<std::string> &ex);
int main()
{
std::vector<std::string> ex1(3);
ex1[0]="ab";
ex1[1]="cd";
ex1[2]="ef";
auto VS = simpleTransform(ex1);
std::copy(VS.begin(),VS.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
return 0;
}
std::vector<std::string> simpleTransform(const std::vector<std::string> &ex)
{
size_t N = ex.size();
size_t M = ex[0].size();
std::vector<std::string> VS(pow(M,N));
size_t count=0;
std::function<void(size_t,std::vector<size_t>)> Var=
[&](size_t ind,std::vector<size_t> vec)
{
if(ind==0)
{
std::string r;
r.resize(N);
for(size_t j=0;j<N;j++)
r[j] = ex[j][vec[j]-1];
VS[count] =r;
count++;
return;
}
else
{
std::vector<size_t> newvec(vec);
auto temp = N-ind+1;
newvec.resize(temp);
range(1,M)>>for_each([&](int const & j){
newvec[temp-1]=j;
Var(ind-1,newvec);});
}
};
Var(N,std::vector<size_t>());
return VS;
}
我没有对输入数据进行验证。
关于多个字符串的 C++ 笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30467698/