我是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;
}
答案 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
:
it
string
开始
strtol
提取每个号码result
','
++it
result
先决条件:此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;
}
}