字符串向量的有效组合

时间:2017-06-09 13:13:08

标签: c++ c++11 vector combinatorics

我需要运行一个有效的函数来生成字符串组合。我在SO中使用了多个答案来编写可行的东西。组合向量,然后按字符对结果字符串进行排序,然后通过将结果向量插入无序集合中来删除重复字符串。该函数需要在长向量(100K)上运行1e7次,我需要帮助运行更高效的代码。这就是我现在所拥有的:

vector<string> vec_combos(vector<string> v1, vector<string> v2) {
    vector<string> res;
    unordered_set<string> s;
    for(int i=0;i<v1.size();i++) {
        for(int j=0;j<v2.size();j++){
            res.push_back(v1[i]+v2[j]);
            sort(res.back().begin(),res.back().end());
        }
    }
    for( int i = 0; i < res.size(); ++i ) s.insert( res[i] );
    res.assign( s.begin(), s.end() );
    return res;
}

int main() {
    vector<string> v1 = {"ab","bc","ca"}, v2 = {"a","b"},v3;
    // combined vector = {"aba","bca","caa","abb","bcb","cab"}
    // sort string chars = {"aab","abc","aac","abb","bbc","abc"}
    // remove duplicates = {"aab","abc","aac","abb","bbc"}
    v3 = vec_combos(v1, v2);
    for(int i=0;i<v3.size();i++) {
        cout << v3[i] << ",";
    }
    return(0);
}

1 个答案:

答案 0 :(得分:1)

通过引用传递,并避免临时不需要的容器。 你可以使用类似的东西:

std::vector<std::string> vec_combos2(const std::vector<std::string>& v1,
                                     const std::vector<std::string>& v2)
{
    std::unordered_set<std::string> words; // Or std::set<std::string>

    for (const auto& s1 : v1) {
        for (const auto& s2 : v2) {
            std::string s = s1 + s2;
            std::sort(s.begin(), s.end());
            words.insert(std::move(s));
        }
    }
    return { words.begin(), words.end() };
}

Demo