首页 > 解决方案 > C++ - 我想将来自字符串向量指针的数据组合成以下格式的静态字符串向量

问题描述

我的字符串向量具有基于用户想要的动态大小

std::vector<std::string>* allTags = new std::vector<std::string>[tvSize];

填充 allTags 变量

for (unsigned int i = 0; i < tvSize; i++)
    allTags[i] = ParseData(vals[i]);

现在假设 allTags 指针的大小为 3,以下是每个中的值:-

allTags[0] = { "0", "1", "2"}

allTags[1] = { "a", "b", "c"}

allTags[2] = { "X", "Y", "Z"}

我想将所有 3 个 allTag 的数据组合在字符串向量中,比如 combine_data。但我想通过以下方式做到这一点: -

combined_data[0] = "0->a->X"; combined_data[1] = "0->a->Y"; combined_data[2] = "0->a->Z";

combined_data[3] = "0->b->X"; combined_data[4] = "0->b->Y"; combined_data[5] = "0->b->Z";

combined_data[6] = "0->c->X"; combined_data[7] = "0->c->Y"; combined_data[8] = "0->c->Z";

combined_data[9] = "1->a->X"; combined_data[10] = "1->a->Y"; combined_data[11] = "1->a->Z";

等等。但我无法为此提出一个算法。任何人都可以帮忙吗?

标签: c++vector

解决方案


你想要这样的东西:

vector<string> function(int lvl)
{
    if (lvl == tvSize) return vector<string>(0);
    
    vector<string> r; // some compilers will complain because of ()
    vector<string> v = funtion(lvl + 1);
    
    for(int i = 0; i < allTags[lvl].size(); i++)
    {
        if (v.size() != 0)
        {
            for(int k = 0; k < v.size(); k++)
            { 
                string result = allTags[lvl][i];

                //result += new string("->").append(v[k]); - memory leak
                string pom("->");
                result += pom.append(v[k]);
                r.push_back(result);
            }
        }
        else{ r.push_back(allTags[lvl][i]); }
    }
    
    return r;
}

阅读std::vector 文档。您想要的是每个级别上的所有排列,因此复杂度为 O(n^(r + 1)),其中 n 是每行中的元素数,在您的示例中 r 是 tvSize,您对此无能为力,但是如果您不需要所有排列,则可以在任何递归级别上排除某些元素。所以如果你不需要'c'的排列,你的算法对于O(n ^(r + 1 - l))会更快,其中l是'c'的级别。


推荐阅读