如何从输入字符串制作二维向量?

Posted

技术标签:

【中文标题】如何从输入字符串制作二维向量?【英文标题】:How to make a 2d vector from input string? 【发布时间】:2020-12-19 13:26:44 【问题描述】:

我在大学考试的一个编码问题中遇到了这个问题,我知道答案但无法理解,因为我不知道如何解析字符串并将其转换为二维向量。 所以我得到了一个字符串形式的二维向量

"[[1,4], [5,7], [4,1], [8,9]]"

我想把这个字符串转换成vector<vector<int>>

编辑

也许我上次并不清楚,我错过了一件事。字符串是

"[[1,4], [5,7], [4,1], [8,9]]"

我希望这个字符串是二维向量的形式。所以,假设我有一个向量vec 定义为vector<vector<int>> vec。然后vec[0]=1,4, vec[1]=5,7, vec[2]=4,1, vec[3]=8,9。以下是我所做的,它显示不正确的输出

#include<iostream>
#include<sstream>
#include<vector>
using namespace std;

int main()

    string str="[[1,4], [5,7], [4,1], [8,9]]";
    stringstream ss(str);
    vector<vector<int>> vec;
    string temp;
    while(ss>>temp)
        cout<<temp<<endl;
        vector<int> t;
        int x,y;
        stringstream ss2(temp);
        while(ss2>>x>>y)
        
            t.push_back(x);
            t.push_back(y);

        
        vec.push_back(t);
    

【问题讨论】:

请提供一个 end-2-end 示例,即此字符串应成为此对象。有很多方法可以从您的示例字符串中获取向量的向量。然后提供您迄今为止尝试过但不起作用的方法。 , , 是两个不同的分隔符吗?这种格式是固定的吗?在这种情况下,您可以先删除前两个字符和后两个字符,以], [ 分割,然后以, 分割。 这实际上是这个问题的一个变体:***.com/questions/1120140/…。该解决方案只需要小幅调整 这能回答你的问题吗? ***.com/questions/1120140/… 对此类事情的一般建议: 1. 尝试编写可以在以后重用的通用函数。例如,可以分隔给定字符串的函数,即字符串 -> 字符串向量。 2. 考虑创建一个状态机。有一个阶段的枚举,然后是一个带有当前阶段切换的大循环。使用这种技术,您可以做很多事情。 3. 如果你在 SO 上提出要求,请在你身边表现出一些努力。如果您需要任何类型的开始,请考虑您可以像遍历数组一样遍历字符串的字符。 【参考方案1】:

一般的答案是编写一个递归下降解析器(查找它)。这是一种奇特的说法,即您为每个非终结符(vector2、vector、int)编写一个函数,然后您通常只查看第一个字节来确定要执行的操作。在这种情况下,您的语法可能是:

vector2 = "[" vector (, " " vector) "]"
vector = "[" int (, number) "]"
number = 0 | 1 [0-9]

然后您实现 number、vector 和 vector_vector,类似于 @StPiere 之前向您展示的方式。

我通常使用 c,我发现这个通用函数签名是一个有用的开始:

char *parse_something(const char *s, something *v)

其中 s 是您正在解析的字符串,返回值是您接下来要解析的内容。

【讨论】:

不要使用上面/下面来引用其他答案。这取决于每个用户的排序。我没有看到你上面的答案 好点。使用时间参考来代替在我提交答案时发布了详细答案。【参考方案2】:

这里是快速实现Godbolt:

注意:此答案不处理整数多于一位的情况。它不是通用的或易于扩展的,但由于这是一个家庭作业问题,您可以理解和改进代码。

#include <string>
#include <vector>
#include <istream>
#include <sstream>
#include <cctype>
#include <iostream>
#include <iterator>

int main()

    std::string input"[[1,4], [5,7], [4,1], [8,9]]";

    std::stringstream ssinput;
    auto it = std::istream_iterator<char>ss;

    std::vector<std::vector<int>> output;
    std::vector<int> inner;

    // Loop through the string, one character at a time
    while (it != std::istream_iterator<char>)
    
        ++it;
        
        // If we encounter a digit, push it into the inner vector
        if (std::isdigit(*it))
        
            // Dirty hack to convert char to integer (assumes ASCII)
            inner.push_back(*it - 48);
        

        // If you encounter a ']' char, then push inner vector into the outer vector
        // and then clear the inner vector

        // For the final ']', the inner vector will be size 0, ignore this case
        if (*it == ']')
        
            if (inner.size() != 0)
            
                output.push_back(inner);
            
            inner.clear();
        
    

【讨论】:

meta.***.com/questions/334822/… @ThomasSablik 您认为这个答案的哪个方面需要改进? 删除代码。这是一个家庭作业问题。您可以帮助解决问题,但您不应该提供完整的解决方案。 嘿,谢谢,这正是我想要的。你能指出我在代码中犯的错误吗? @Levi 当然,您的代码假定读入的所有内容都是int,但您还必须解析开/关括号和逗号字符。我的实现通过将字符串读取为一系列字符并检查它们是否是数字来解决这个问题。因此它将处理分隔符, 和右括号]【参考方案3】:
#include <iostream>
#include <vector>
using namespace std;

template <typename Range>
void print_range(const Range& r)

    for (const auto& e : r)
        cout << e << " ";
    cout << endl;


int main()

    vector<int> v;
    vector<vector<int>> vv;

    char c;
    int cnt = 0;

    while (cin >> c)
    
        if (c == ',' || c == ' ' || c == '\n')
        
            continue;
        

        if (c == '[')
        
            ++cnt;
            v.clear();
            continue;
        

        if (c == ']')
        
            --cnt;
            if (cnt == 0)
                break;

            vv.push_back(v);
            v.clear();
            continue;
        

        cin.unget();

        int x;
        if (cin >> x)
            v.push_back(x);
    

    for (const auto& vec : vv)
        print_range(vec);

【讨论】:

meta.***.com/questions/334822/… @ThomasSablik 来自您的链接:“不要对真诚回答家庭作业问题的其他人投反对票,即使他们违反了这些准则(除非即使问题与家庭作业无关,该答案也值得反对) )。”

以上是关于如何从输入字符串制作二维向量?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 如何制作二维向量函数?

如何从向量向量中检索值?

如何创建二维字符串向量并在其中插入数据?

将字符串列表插入二维向量

将字符串向量转换为双二维数组向量

如何从多个文本框输入中读取字符串并将它们存储在 Shiny 中的向量中?