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

标签 c++ string cartesian-product

我将字符串存储在一个 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/

相关文章:

c++ - 赋值运算符=

c++ - C++ 中的简单序列化示例

arrays - 如何在经典asp中拆分字符串

sql - 我怎样才能在 PostgreSQL 中得到一个随机的笛卡尔积?

c++ - C++中的函数 Hook ?

c++ - 使用从未打算在常量表达式中使用的 constexpr 变量是否有好处?

string - "Contains"Delphi 字符串助手是否区分大小写?

c# - 填充未应用于字符串

python - 字符的组合和排列

python - itertools 产品使用太多内存