C++ 将集合转换为向量的向量
该集合包含1,2,2,1,1,2,2,2,每个元素都是字符串。 我想输出一个包含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 )
[
[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;
}
}