将一组转换为矢量矢量

时间:2015-04-13 14:45:47

标签: c++ algorithm vector

我是C ++的新手,我正在尝试将unordered_set<string>转换为vector<vector<int>>

该集合包含("1,2,2","1","1,2","2","2,2"),每个元素都是一个字符串。 我想输出一个包含<{p}的vector<vector<int>>

[
  [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;
}

3 个答案:

答案 0 :(得分:0)

可能的解决方案之一可能是:

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()存在的原因。

答案 1 :(得分:0)

如果您不需要验证string,则可以transform构建vector<vector<int>>

set<string> foo{ "1,2,2", "1", "1,2", "2", "2,2" };
vector<vector<int>> bar(foo.size());

transform(foo.begin(), foo.end(), bar.begin(), [](const string& i){
    vector<int> result;
    auto it = const_cast<char*>(i.c_str());

    for (result.push_back(static_cast<int>(strtol(it, &it, 10)));
         it < i.c_str() + i.size();
         result.push_back(static_cast<int>(strtol(++it, &it, 10))));
    return result;
});

转换中的lambda将逐步执行string

  1. it
  2. 的开头string开始
  3. 使用strtol提取每个号码
  4. 将每个号码推入result
  5. 使用','
  6. 逐步调整每个++it
  7. 返回构建的result
  8. 先决条件:此lambda假定您的输入set不包含:

    • string
    • 以逗号开头或结尾的string(如"1,2,"所示)
    • 具有连续逗号的string(如"1,,2"
    • 该字符串仅包含 包含数字和逗号

    注意:作为一般规则,const_cast是不好的,所以我想评论为什么我要制作一个。{1}}。请注意,永远不会写入*it,只会写入it。所以这并没有违反const的{​​{1}} - ness。替代const string& i并不需要strtol的{​​{1}}是const_cast,但在我们从C ++ 14获得stoi之前,我们需要构建每个逗号都有一个新的string_view,这样效率非常低。

答案 2 :(得分:0)

这是使用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;
    }
}
相关问题