给c++写python的split()与input()【python一样写c++、一】
阅读原文时间:2023年07月09日阅读:1

python的split确实是很香的功能。

写c++的时候,就会想着,要是能直接input().split()那不挺好。

实际上真的可以:自己动手,丰衣足食。

先放成品展示。

int main(){
    auto k=input().split();//k的类型是vector<string>
    cout<<k<<endl;
}

完整代码在文章末尾。

1.首先,写一个input()不难,getline+return就行

mystring input(string c=""){
    cout<<c;
    mystring s;
    getline(cin,s);
    return s;
}

为什么是mystring呢?因为我们想要实现input().split()的效果。普通的string不能胜任,所以自己构造一个mystring的类(具体往下看)

2.写一个split()函数。

考虑到便捷性,直接把它写成成员函数。

这个mystring类就继承string类。写成class mystring:public string也行。

用struct主要是应为加入的成员函数都是public。

实现部分就爆扫过去,扫到ch(默认空格)就记录位置,然后插入到一个vector

struct mystring:string{//继承string类,写成class mystring:public string也行
    mystring() :string() {}
    mystring& operator=(const string &c) {
        (*this).assign(c);
        return *this;
    }
    vector<string> split(char c=' '){
        vector<string> x;
        int last=0,len=0;
        for(int i=0;i<size();++i){
            if(at(i)==c){
                x.push_back(substr(last,len));
                last=i+1;
                len=0;
            }
            else{
                len++;
            }
        }
        if(last<size())
            x.push_back(substr(last,len));
        return x;
    }
}s;

其实更简洁与接近python的是使用find,但时间复杂度都是O(n),写好了我也不想改了。

本文作者XXOY

3.OK!

我们就可以直接

auto k=input().split();

用auto是因为简单,也可以写成vector k;

4.加一个输出函数

由于c++不能直接打印vector,所以我们自己写一个重载。

具体的写法下次再教(可以关注我),这次先放个例子。

template<typename T>
ostream& operator<<(ostream &o,vector<T> &x){
    char ch=0;
    if(typeid(T)==typeid(string)) ch='\'';
    o<<"["<<ch<<x[0]<<ch;
    for(int i=1;i<x.size();++i){
        o<<", "<<ch<<x[i]<<ch;
    }
    o<<"]";
    return o;
}

还加入了string的特判,加一个‘,更接近python。

OK,完毕,下面是完整代码

#include<bits/stdc++.h>
using namespace std;

struct mystring:string{//继承string类
    mystring() :string() {}
    mystring& operator=(const string &c) {
        (*this).assign(c);
        return *this;
    }
    vector<string> split(char c=' '){
        vector<string> x;
        int last=0,len=0;
        for(int i=0;i<size();++i)
            if(at(i)==c){
                x.push_back(substr(last,len));
                last=i+1,len=0;
            }
            else ++len;
        if(last<size())
            x.push_back(substr(last,len));
        return x;
    }
}s;

template<typename T>
ostream& operator<<(ostream &o,vector<T> &x){
    char ch=0;
    if(typeid(T)==typeid(string)) ch='\'';
    o<<"["<<ch<<x[0]<<ch;
    for(int i=1;i<x.size();++i){
        o<<", "<<ch<<x[i]<<ch;
    }
    o<<"]";
    return o;
}

mystring input(string c=""){
    cout<<c;
    mystring s;
    getline(cin,s);
    return s;
}

int main()
{
    auto k=input().split();//k的类型是vector<string>
    cout<<k<<endl;
}

//本文作者XXOY

这就是input()、split() 的全部内容了。

我还写了比如类似python map一样,转换列表(vector)的东西,将和那个cout<<vector一起,分成两篇来讲。

比如这样

    auto c=my_map(my_int,k);//k是vector<string>
    cout<<c;

后续请看我主页(应该能咕完)。

我是XXOY,我们下次再见。