Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将集合转换为向量的向量_C++_Algorithm_Vector - Fatal编程技术网

C++ 将集合转换为向量的向量

C++ 将集合转换为向量的向量,c++,algorithm,vector,C++,Algorithm,Vector,该集合包含1,2,2,1,1,2,2,2,每个元素都是字符串。 我想输出一个包含 [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 那么如何解析每个元素字符串并使其看起来像上面的方案呢 #define SSTR( x ) dynamic_cast< std::ostringstream & >( \ ( std::ostringstream() << std::dec << x )

该集合包含1,2,2,1,1,2,2,2,每个元素都是字符串。 我想输出一个包含

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]
那么如何解析每个元素字符串并使其看起来像上面的方案呢

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

vector<vector<int> > subsetsWithDup(const vector<int> &num) {
    unordered_set<string> result;
    for (int i = 0; i < num.size(); i++)
    {
        result.insert(SSTR(num[i]));
        for (int j = i+1; j < num.size(); j++)
        {
            string d = SSTR(num[i]) + "," +SSTR(num[j]);
            result.insert(d);
        }
    }

    string lastString= "";
    for (int i = 0; i < num.size(); i++)
    {
        if ( i == num.size() -1)
        {
            lastString+= SSTR(num[i]);
        }
        else
        {
            lastString+= SSTR(num[i])+",";
        }
    }

    result.insert(lastString);

    // convert result back to vector<vector<int>>
    return result;
}

可能的解决方案之一是:

vector<string> split (string str, string seq) {
        vector<string> ret {};
        size_t pos {};

        while ((pos = str.find (seq)) != string::npos) {
            ret.push_back (str.substr (0, pos));
            str = str.substr (pos+seq.size ());
        }
        ret.push_back (str);

        return ret;
}

vector<int> to_vec_int (vector<string>&& vec) {
        vector<int> ret {};

        for (const auto& v : vec) {
                ret.push_back (stoi (v));
        }
        return ret;
}

int main () {
        unordered_set<string> st {"1,2,2","1","1,2","2","2,2"};
        vector<vector<int>> vec {};
        for (const auto& s : st) {
                vec.push_back (to_vec_int (split (s, ",")));
        }

        for (const auto& v : vec) {
                for (const auto& s : v) {
                        cout << s << " ";
                }
                cout << endl;
        }

        return 0;
}

因为元素是用逗号分隔的,所以我们可以使用split函数分割它们,得到字符串的向量。该向量必须转换为int向量,这就是to_vec_int存在的原因

如果不需要验证字符串,可以进行转换来构造向量:

转换中的lambda将逐步遍历字符串:

从字符串的开头开始 使用strtol提取每个数字 将每个数字推到结果中 用它跨过每一个“,” 返回构造的结果 前提条件:此lambda假设您的输入集不包含:

空字符串 以逗号开头或结尾的字符串,如1,2所示, 具有连续逗号的字符串,如1、2中所示 字符串只包含数字和逗号
注意:一般来说,const_cast是不好的,所以我想评论一下为什么我要制作一个。请注意,*它从未被写入,只是被写入。所以这并不违反常量字符串的常量&i。strtol的另一种不需要常量转换的替代方法是stoi,但在我们从C++14获得字符串视图之前,我们需要在每个逗号处构造一个新字符串,这样效率非常低。

下面是另一种可能的解决方案,使用istringstream查找逗号:

#include <iostream>
#include <string>
#include <vector>
#include <unordered_set>
#include <sstream>

void main()
{
    using namespace std;
    unordered_set<string> strSet;
    strSet.insert("1,2,2");
    strSet.insert("1");
    strSet.insert("1,2");
    strSet.insert("2");
    strSet.insert("2,2");
    vector<int> nums;
    vector<vector<int>> arr_of_nums;

    for (const auto &str : strSet) {
        istringstream strStream(str);
        string strToInt;
        while (getline(strStream, strToInt, ',')) {
            nums.push_back(stoi(strToInt));
        }
        arr_of_nums.push_back(nums);
        nums.clear();
    }
    for(const auto &nums : arr_of_nums) {
        for (const auto &num : nums) {
            cout << num << ",";
        }
        cout << endl;
    }
}

我不知道你想让它们按什么顺序排列——看起来完全是随机的!顺序并不重要,所以你提供了一个算法:我不明白你想让我们做什么。证明它是正确的?通过调试器查看输出结果。我无法将结果集转换为int向量。我需要一种聪明的方法来解析每个元素字符串,然后将其放入向量。您的代码将向量作为输入。在中间,它将这些值转换为字符串的部分,为什么?你是在问如何将你的数据转换成一个字符串,而不是一个整数向量?从代码中,您的代码似乎生成了传入向量的幂集。为什么不直接生成幂集,而不是通过中间的字符串?想象一下,如果有人问如何将糖从面粉中分离出来。你问为什么,他们会给你一份食谱,上面写着混合糖和面粉。然后分开。你怎么回答?
#include <iostream>
#include <string>
#include <vector>
#include <unordered_set>
#include <sstream>

void main()
{
    using namespace std;
    unordered_set<string> strSet;
    strSet.insert("1,2,2");
    strSet.insert("1");
    strSet.insert("1,2");
    strSet.insert("2");
    strSet.insert("2,2");
    vector<int> nums;
    vector<vector<int>> arr_of_nums;

    for (const auto &str : strSet) {
        istringstream strStream(str);
        string strToInt;
        while (getline(strStream, strToInt, ',')) {
            nums.push_back(stoi(strToInt));
        }
        arr_of_nums.push_back(nums);
        nums.clear();
    }
    for(const auto &nums : arr_of_nums) {
        for (const auto &num : nums) {
            cout << num << ",";
        }
        cout << endl;
    }
}