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<string>里
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),写好了我也不想改了。
3.OK!
我们就可以直接
auto k=input().split();
用auto是因为简单,也可以写成vector<string> 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,我们下次再见。