南海石门中学第六届创新班 2015-4-25 课时总结

本文详细介绍了C++ STL中String类的功能与用法,包括Length()、Size()、Find()、Append()、Replace()等成员函数,并提供了字符串与数字转换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    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");
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值