我将字符串存储在矢量中:vector<string> ex = {"ab", "cd", "ef"}
。
现在我需要创建这些字符串的笛卡尔积(向量中的字符串数,字符串的长度也不固定!)。结果应该是:
ace
acf
ade
adf
bce
bcf
bde
bdf
是否存在已经存在的内置函数,或者您对如何执行实现有任何建议?
字符串的单个字母应该用于笛卡尔积而不是整个字符串!
答案 0 :(得分:2)
答案 1 :(得分:0)
好的我想出了一个解决方案。它可能不是最好的,并且肯定会对代码进行一些改进,但它足以满足我的目的,并且如果有人需要它:
vector<string> getProducts(vector<string> s) {
int combinations = 1;
vector<string> res;
for (unsigned int i=0; i<s.size(); i++) {
combinations *= s.at(i).length();
}
for (unsigned int i=0; i<s.size(); i++) {
string cur = s.at(i);
int div = combinations / cur.length();
int count = 0;
for (unsigned int ch=0; ch<cur.length(); ch++) {
for (int len=0; len<div; len++) {
if (i==0) {
res.push_back(string(cur.substr(ch, 1)));
} else {
string tmp = res.at(count);
tmp.append(string(cur.substr(ch,1)));
res.at(count) = tmp;
}
count++;
}
if ((ch == cur.length()-1) && (count <= res.size()-1) && i>0) {
ch = -1;
}
}
combinations = div;
}
return res;
}
答案 2 :(得分:-1)
可能是使用std :: accumulate可以实现的结果。
需要此表单的二进制操作
std::vector<string> product(const std::vector<string> &init, string value)
{
std::string result ;
for (auto ch : value)
if (init.empty())
result.push_back(string(1, ch)) ;
else
for (auto str : init)
result.push_back(str + string(1, ch)) ;
return result ;
}
然后调用std :: accumulate(vect.begin(),vect.end(),std :: vector(),product)