多个字符串的C ++笛卡尔积

时间:2015-05-26 19:54:06

标签: c++ string cartesian-product

我将字符串存储在矢量中:vector<string> ex = {"ab", "cd", "ef"}。 现在我需要创建这些字符串的笛卡尔积(向量中的字符串数,字符串的长度也不固定!)。结果应该是:

  ace
  acf
  ade
  adf
  bce
  bcf
  bde
  bdf

是否存在已经存在的内置函数,或者您对如何执行实现有任何建议?

字符串的单个字母应该用于笛卡尔积而不是整个字符串!

3 个答案:

答案 0 :(得分:2)

我可以使用这种方式提供这种方式 https://cpplinq.codeplex.com/

border-box

我没有对输入数据进行验证。

答案 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)