您的位置:首页 > 编程语言 > C语言/C++

C++学习 STL之一:字符串用法详解

2015-02-13 17:09 435 查看
字符串是程序设计中最复杂的变成内容之一。STL string类提供了强大的功能,使得许多繁琐的编程内容用简单的语句就可完成。string字符串类减少了C语言编程中三种最常见且最具破坏性的错误:超越数组边界;通过违背初始化或被赋以错误值的指针来访问数组元素;以及在释放了某一数组原先所分配的存储单元后仍保留了“悬挂”指针。
    string类的函数主要有:

    

Member functions

(constructor)
Construct string object (public member function )(destructor)
String destructor (public member function )operator=
String assignment (public member function )
Iterators:

begin
Return iterator to beginning (public member function )end
Return iterator to end (public member function )rbegin
Return reverse iterator to reverse beginning (public member function )rend
Return reverse iterator to reverse end (public member function )cbegin 
Return const_iterator to beginning (public member function )cend 
Return const_iterator to end (public member function )crbegin 
Return const_reverse_iterator to reverse beginning (public member function )crend 
Return const_reverse_iterator to reverse end (public member function )
Capacity:

size
Return length of string (public member function )length
Return length of string (public member function )max_size
Return maximum size of string (public member function )resize
Resize string (public member function )capacity
Return size of allocated storage (public member function )reserve
Request a change in capacity (public member function )clear
Clear string (public member function )empty
Test if string is empty (public member function )shrink_to_fit 
Shrink to fit (public member function )
Element access:

operator[]
Get character of string (public member function )at
Get character in string (public member function )back 
Access last character (public member function )front 
Access first character (public member function )
Modifiers:

operator+=
Append to string (public member function )append
Append to string (public member function )push_back
Append character to string (public member function )assign
Assign content to string (public member function )insert
Insert into string (public member function )erase
Erase characters from string (public member function )replace
Replace portion of string (public member function )swap
Swap string values (public member function )pop_back 
Delete last character (public member function )
String operations:

c_str
Get C string equivalent (public member function )data
Get string data (public member function )get_allocator
Get allocator (public member function )copy
Copy sequence of characters from string (public member function )find
Find content in string (public member function )rfind
Find last occurrence of content in string (public member function )find_first_of
Find character in string (public member function )find_last_of
Find character in string from the end (public member function )find_first_not_of
Find absence of character in string (public member function )find_last_not_of
Find non-matching character in string from the end (public member function )substr
Generate substring (public member function )compare
Compare strings (public member function )
Member constants

npos
Maximum value for size_t (public static member constant )
Non-member functions overloads

operator+
Concatenate strings (function )relational
operators

Relational operators for string (function )swap
Exchanges the values of two strings (function )operator>>
Extract string from stream (function )operator<<
Insert string into stream (function )getline
Get line from stream into string (function )

1.string对象的定义和初始化

    初始化string对象的几种方式有:

string s1;//默认构造函数,s1为空串
string s2(s1);//将s2初始化为s1的一个副本
string s3("value");//将s3初始化为value
string s4(n,'c');//将s4初始化为字符'c'的n个副本
string s5(s4,0,3)//从s4中下标为0的字符开始,连续取3个字符构成s5
string s6 = s5 + "value";//value 接在s5后面,注意+操作符的左右操作数至少有一个是string类型的
迭代器创建,    由于可将string看作字符的容器对象,因此可以给string类的构造函数传递两个迭代器,将它们之间的数据复制到心的string对象中。

[cpp]view
plaincopyprint?

#include "stdafx.h"  
#include <iostream>  
#include <string>  
  
using namespace std;  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    string s1("How are you");  
    string s2(s1.begin(),s1.end());  
    string s3(s1.begin()+4,s1.begin()+7);  
    cout<<s1<<endl;  
    cout<<s2<<endl;  
    cout<<s3<<endl;  
    return 0;  
}  

<span style="font-size:12px;">#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string s1("How are you");
string s2(s1.begin(),s1.end());
string s3(s1.begin()+4,s1.begin()+7);
cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl;
return 0;
}
</span>


2.string 对象的读写

    string对象的读写可以通过两个方式:

通过cin从标准输入中读取,cin忽略开题所有的空白字符,读取字符直至再次遇到空白字符,读取终止。
用getline读取整行文本,getline函数接受两个参数:一个输入流对象和一个string对象。getline函数从输入流的下一行读取,并保存读取的内容到string中,但不包括换行符。和输入操作符不一样的是,getline并不忽略开头的换行符。即便它是输入的第一个字符,getline也将停止读入并返回。如果第一个字符就是换行符,则string参数将被置为空string。

3.string对象的插入操作

    字符串一般通过包括首字符前、尾字符后、任意位置插入等几种情况。
    

[cpp]view
plaincopyprint?

#include "stdafx.h"  
#include <iostream>  
#include <string>  
  
using namespace std;  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    string s1("do");  
    cout<<"Initial size is:"<<s1.size()<<endl;  
    s1.insert(0,"How ");  
    s1.append(" you");  
    s1 = s1 + " do ?";  
    cout<<"Final size is:"<<s1.size()<<endl;  
    cout<<s1<<endl;  
    return 0;  
}  

<span style="font-size:12px;">#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string s1("do");
cout<<"Initial size is:"<<s1.size()<<endl;
s1.insert(0,"How ");
s1.append(" you");
s1 = s1 + " do ?";
cout<<"Final size is:"<<s1.size()<<endl;
cout<<s1<<endl;
return 0;
}</span>
程序运行结果如下:



通过该函数可以得出:

    insert函数,第一个参数表明插入源串的位置,第二个参数表面要插入的字符串,因此利用该函数可以实现串首、串尾及任意位置处的字符串插入功能。
append函数,仅有一个输入参数,在源字符串尾部追加该字符串。
利用+实现字符串的连接,从而创建新的字符串。

4.替换操作

    常用的是replace函数,有三个输入参数:第一个用于指示从字符串的什么位置开始改写,第二个用于指示从源字符串中删除多少个字符,第三个是替换字符串的值。
    

[cpp]view
plaincopyprint?

#include "stdafx.h"  
#include <iostream>  
#include <string>  
  
using namespace std;  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    string s1("I love you forever !");  
    cout<<"替换前:"<<s1<<endl;  
    s1.replace(7,3,"dachun");  
    cout<<"替换后"<<s1<<endl;  
      
    return 0;  
}  

<span style="font-size:12px;">#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string s1("I love you forever !");
cout<<"替换前:"<<s1<<endl;
s1.replace(7,3,"dachun");
cout<<"替换后"<<s1<<endl;

return 0;
}
</span>
程序运行结果如下:



5.查询操作

    查询常用的函数有:

    string::npos:这是string类中的一个成员变量,一般应用在判断系统查询函数的返回值上,若等于该值,表明没有符合查询条件的结果值。
find函数:在一个字符串中查找指定的单个字符或字符组。如果找到,就返回首次匹配的开始位置;如果没有找到匹配的内容,则返回string::npos。一般有两个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.
find_first_of函数:在一个字符串中进行查找,返回值是第一个与指定字符串中任何字符匹配的字符位置;如果没有找到匹配的内容,则返回string::npos。一般有两个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.
find_last_of函数:在一个字符串中进行查找,返回值是最后一个与指定字符串中任何字符匹配的字符位置;如果没有找到匹配的内容,则返回string::npos。一般有两个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.
find_first_not_of函数:在一个字符串中进行查找,返回值是第一个与指定字符串中任何字符都不匹配的字符位置;如果没有找到匹配的内容,则返回string::npos。一般有两个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.
find_last_not_of函数:在一个字符串中进行查找,返回下标值最大的与指定字符串中任何字符都不匹配的字符位置;如果没有找到匹配的内容,则返回string::npos。一般有两个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.

rfind函数:对一个串从尾至头查找指定的单个字符或字符组,如果找到,就返回首次匹配的开始位置;如果没有找到匹配的内容,则返回string::npos。一般有两个输入参数,一个是待查询的字符串,一个是查询的起始位置,默认起始位置为0.

[cpp]view
plaincopyprint?

#include "stdafx.h"  
#include <iostream>  
#include <string>  
  
using namespace std;  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    string s1("what's your name? my name is TOM. How do you do? Fine,thanks.");  
    int n = s1.find("your");  
    cout<<"the first your pos:"<<n<<endl;  
    n = s1.find("you",15);  
    cout<<"the first you pos begin from 15:"<<n<<endl;  
    n = s1.find_first_of("abcde");  
    cout<<"find pos when character within abcde:"<<n<<endl;  
    n = s1.find_first_of("abcde",3);  
    cout<<"find pos when character within abcde from third character:"<<n<<endl;  
      
    return 0;  
}  

<span style="font-size:12px;">#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string s1("what's your name? my name is TOM. How do you do? Fine,thanks.");
int n = s1.find("your");
cout<<"the first your pos:"<<n<<endl;
n = s1.find("you",15);
cout<<"the first you pos begin from 15:"<<n<<endl;
n = s1.find_first_of("abcde");
cout<<"find pos when character within abcde:"<<n<<endl;
n = s1.find_first_of("abcde",3);
cout<<"find pos when character within abcde from third character:"<<n<<endl;

return 0;
}
</span>

程序运行结果如下:



 

6.删除字符操作

    主要用erase函数,有两个迭代器输入参数,之间表示的字符将被删除掉。
    

[cpp]view
plaincopyprint?

#include "stdafx.h"  
#include <iostream>  
#include <string>  
  
using namespace std;  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    string s1("what's your name? my name is TOM. How do you do? Fine,thanks.");  
    s1.erase(s1.begin(),s1.begin()+17);  
    cout<<"after erase to s1 is:"<<s1<<endl;  
  
    string s2 = "i love you forever!";  
    s2.erase(s2.begin(),s2.end());  
    cout<<"after erase to s2 is"<<s2<<endl;  
    return 0;  
}  

<span style="font-size:12px;">#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
string s1("what's your name? my name is TOM. How do you do? Fine,thanks.");
s1.erase(s1.begin(),s1.begin()+17);
cout<<"after erase to s1 is:"<<s1<<endl;

string s2 = "i love you forever!";
s2.erase(s2.begin(),s2.end());
cout<<"after erase to s2 is"<<s2<<endl;
return 0;
}
</span>
程序运行结果如下:



7.比较操作

    主要是一句ASCII值来比较大小。若字符串s1“大于”s2,表明两者相比较时遇到了第一对不同的字符,字符串s1中第一个不同的字符比字符串s2中同样位置的字符在ASCII表中位置更靠后。
    C++ STL提供了多钟字符串比较方法,他们各具特色。其中最简单的就是使用非成员的重载运算符函数operator==、operator!=、operator>、operator<、operator>=和operator<=。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: