c++ 中括号字符串转换成数组

#include <iostream>
#include <utility>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>

using namespace std;

class NestedVec {
public:
    NestedVec() {
        valid = false;
        _value = 0;
    }

    explicit NestedVec(int value) {
        valid = true;
        _value = value;
    }

    bool isInteger() const {
        return valid;
    }

    int getInteger() const {
        return _value;
    }

    void setInteger(int value) {
        valid = true;
        _value = value;
    }

    void add(const NestedVec &ni) {
        vn.push_back(ni);
    }

    [[nodiscard]] const vector<NestedVec> &getList() const {
        return vn;
    }

private:
    bool valid;
    int _value;
    vector<NestedVec> vn;
};

NestedVec dfs(const string &s, int &pos) {
    NestedVec ne;
    ++pos;
    while (pos < s.size()) {
        if (isdigit(s[pos]) || s[pos] == '-') {
            string cur;
            if (s[pos] == '-') {
                cur.push_back(s[pos++]);
            }
            while (isdigit(s[pos])) {
                cur.push_back(s[pos++]);
            }
            ne.add(NestedVec(stoi(cur)));
            cur.clear();
        }
        if (s[pos] == ',' || s[pos] == ' ') {
            ++pos;
        }
        if (s[pos] == '[') {
            NestedVec temp = dfs(s, pos);
            ne.add(temp);
        }
        if (s[pos] == ']') {
            ++pos;
            break;
        }
    }
    return ne;
}

NestedVec deserialize(string s) {
    if (s[0] != '[') {
        return NestedVec(stoi(s));
    }
    int pos = 0;
    return dfs(s, pos);
}

// 一维
vector<int> nestVecToVecOne(const NestedVec &nVec) {
    vector<int> res;
    for (auto &nv : nVec.getList()) {
        res.emplace_back(nv.getInteger());
    }
    return res;
}

// 二维
vector<vector<int>> nestVecToVecTwo(const NestedVec &nVec) {
    vector<vector<int>> res;
    for (int i = 0; i < nVec.getList().size(); ++i) {
        res.push_back(nestVecToVecOne(nVec.getList()[i]));
    }
    return res;
}

// 三维
vector<vector<vector<int>>> nestVecToVecThree(const NestedVec &nVec) {
    vector<vector<vector<int>>> res;
    for (int i = 0; i < nVec.getList().size(); ++i) {
        res.push_back(nestVecToVecTwo(nVec.getList()[i]));
    }
    return res;
}

void oneTest() {
    string s = "[1,2,3]";
    auto x = nestVecToVecOne(deserialize(s));
    cout << "一维输出: " << endl;
    for (auto v : x) {
        cout << v << " ";
    }
    cout << endl;
}

void twoTest() {
    string s = "[[1,2,3], [4, 5, 6], [7, 8, 9]]";
    auto x = nestVecToVecTwo(deserialize(s));
    cout << "二维输出: " << endl;
    for (auto &vec : x) {
        for (auto v : vec) {
            cout << v << "\t";
        }
        cout << endl;
    }
    cout << endl;
}

void threeTest() {
    string s = "[[[1,2,3], [4, 5, 6], [7, 8, 9]], [[10,11,12], [13, 14, 15], [16, 17, 18]]]";
    auto x = nestVecToVecThree(deserialize(s));
    cout << "三维输出: " << endl;
    for (auto &vec : x) {
        for (auto& ve : vec) {
            for (auto v : ve) {
                cout << v << "\t";
            }
            cout << endl;
        }
        cout << endl;
    }
    cout << endl;
}

int main() {
    oneTest();
    twoTest();
    threeTest();
}

输出

在这里插入图片描述