String是C++中STL标准模板库中新加的类,拥有许多的成员函数,底层似乎有点像Vector和Deque。C中其实也有一个string,一般在C++中称为<cstring>或<string.h>。那,为什么要有这么一个新的string呢?
早期的C使用的其实是字符数组,而cstring也其实和字符数组抛不开干系。但是,C++中的string却是一个“类”,贯彻了面向对象的思想,因此,和int、double等不同,它不是一个编译器中所定义的类型,而是一个类!因此,其在思路上都与这cstring、字符数组截然不同。其中,它用'\0'来作为结束指示符,且默认为空。
这节课,我们接触到了许多C++中STL String的强大成员函数,具体面向对象思想请看《面向对象思想》这篇文章。
Length()和Size()
length()和size()实际上完全相同,只不过length()用于字符串更为自然,而size()则一并用于Deque, Vector等,更为广泛。我个人更为倾向于使用length()。
Find()
find(),顾名思义,就是寻找,若找到则返回第一个找到的首字母下标,反之返回-1(听说实际名称叫string.nops),但类型是unsigned int。课上老师还讲到找第n个某元素的方法,使用了find()函数的一个重载,贴出如下:
//本代码仅是代码段,全套代码在后面,已于Dev-C++4.9.9.2上通过测试
#include<string>
using namespace std;
int find_nth(string str, string f, int n){
int k=-1;
for(int i=0;i<n;++i){
k=str.find(f, k+1);
}
return k;
}
//本代码已在Dev-C++4.9.9.2上通过测试
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
int find_nth(string str, string f, int n){
int k=-1;
for(int i=0;i<n;++i){
k=str.find(f, k+1);
}
return k;
}int main(){
string str,d;
int n;
cin>>str>>d;
cin>>n;
cout<<find_nth(str, d , n)<<endl;
system("pause");
}再贴出找到所有字符串的字串位置的方法://本代码仅是代码段,全套代码在后面,已于Dev-C++4.9.9.2上通过测试
#include<string>
using namespace std;
void find_nth(string str, string f){
int k=-1;
for( ; ; ){
k=str.find(f, k+1);
if (k==-1){ break; }
cout<<k<<endl;
}
}//本代码已在Dev-C++4.9.9.2上通过测试
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;
void find_nth(string str, string f){
int k=-1;
for( ; ; ){
k=str.find(f, k+1);
if (k==-1){ break; }
cout<<k<<endl;
}
}int main(){
string str,d;
cin>>str>>d;
find_nth(str, d);
system("pause");
}
Append()
append,顾名思义,这,就是所谓的添加。这堂课上,老师给我们讲述了append()的几个重载,他们是:
string::string append(int n, char k) //除了具体参数外相同,作用是添加n个字符k在字符串末尾
string::string append(string str) //除了具体参数外相同,作用是将str添加于字符串末尾
返回值是string,这似乎意味着我们可以这样写:
string str;str=(str.append("kkk")).append(5, 'v');
实际上,append()相当于多个push_back(),或者说连接字符串,或者说insert()到最后。append()的速度相当的快,比起'+'来说应该快了不止100倍,例如'+'运算10^6次似乎有人说他试过了用了七分钟,而append()则几乎不需要时间。
Replace()
replace,相应的,就是替换,似乎只讲了一种用法:
string::void replace(int start, int length, string str) //除具体参数外相同,作用是将start后length个字符替换为str
实际上,replace()还能够有相当于insert()和erase()的功效,具体如下:
string now; //操作字符串string in; //insert的字符串int inplace; //insert的位置int esstart, esend; //erase的区间,start和end
now.replace(inplace, 0, in); //相当于now.insert(inplace, in);
now.replace(esstart, esend-esstart, ""); //相当于now.erase(esstart, esend);
字符串与数字间的互转C++中较高版本有一些字符串、数字的转换,还有stringstream(sstream)可供使用,但这节课上老师仍然带着我们写了一个stoi(),将字符串转为整型。代码如下(自己后来重编的)://本代码仅是代码段,全套代码在后面,已于Dev-C++4.9.9.2上通过测试
#include <string>
using namespace std;
int stoi(const string& str){
int ans=0;
for(int i=0;i<str.length();++i){
ans=ans*10+str[i]-'0';
}
return ans;
}//本代码已在Dev-C++4.9.9.2上通过测试
#include <iostream>
#include <string>#include <cstdlib>
using namespace std;
int stoi(const string& str){
int ans=0;
for(int i=0;i<str.length();++i){
ans=ans*10+str[i]-'0';
}
return ans;
}
int main(){
string str;
cin>>str;
cout<<stoi(str)<<endl;
system("pause")}
下面再贴一个itos(),将int转为string://本代码仅是代码段,全套代码在后面,已于Dev-C++4.9.9.2上通过测试
#include<algorithm>
#include<string>
using namespace std;
string itos(int n){
string ans;
for( ;n!=0; ){
ans.push_back(n%10+'0');
n/=10;
}
reverse(ans.begin(), ans.end());
return ans;
}//本代码已在Dev-C++4.9.9.2上通过测试
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<string>
using namespace std;
string itos(int n){
string ans;
for( ;n!=0; ){
ans.push_back(n%10+'0');
n/=10;
}
reverse(ans.begin(), ans.end());
return ans;
}int main(){
int n;
cin>>n;
cout<<itos(n)<<endl;
system("pause");
}