1. 程式人生 > >c++string詳解

c++string詳解

string作為一個類出現,它整合的操作函式足以完成我們大多數情況下(甚至是100%)的需要,我們可以用=進行賦值操作,==進行比較,+做連線。可以把他看成c++基本資料型別。

1.標頭檔案#include<string>

2宣告一個c++字串:string str;

string類的建構函式和解構函式如下:

(a)string s;生成一個空字串

(b)string s(str)拷貝建構函式,生成str的複製品

(c)string s(str,stridx)將字串str內始於位置stridxde部分當做字串初值

(d)string s(str,stridx,strlen)將str始於stridx且長度頂多為strlen的部分當做字串初值

(e)string s(cstr)將c字串作為s的初值

(f)string s(chars,chars_len)將c串前chars_len個字元作為s初值

(g)string s(num,c)生成包含num個c字串

(h)string s(beg,end)以區間beg,end(不包含end)內字元作為s初值

(i)s.~string()銷燬所有字元,釋放記憶體

3.字串操作函式

(a)=,assign()賦值

(b)swap()交換兩個串的內容

(c)+=,append(),push_back()在尾部新增字元

(d)insert()插入字元

(e)erase()刪除字元

(f)clear()刪除全部字元

(g)replace()替換字元

(h)+串聯字元

(i)==,!=,<,<=,>,>=,compare()比較字串

(j)size(),length()返回字元數量

(k)max_size()返回字元可能的最大個數

(l)empty()判斷串是否為空

(m)capacity()返回重新分配之前的字元容量

(n)reserve()保留一定量記憶體容量一定數量的字元

(o)[ ],at()存取單一字元

(p)>>,getline()從stream讀取某值

(q)<< 將某值寫入stream

(r)copy()將某值賦值為一個c_string

(s)c_str() 將內容以c_string返回

(t)data() 將內容以字元陣列形式返回

(u)substr()返回某個子字串

(v)find()查詢函式

(w)begin(),end()提供類似stl迭代器支援

(x)rbegin(),rend()逆向迭代器

(y)get_allocator()返回配置器

4.c++字串和c字串轉換

c++串轉c串的方法是:data(),c_str(),copy(),其中,data()以字元陣列形式返回字串內容,不新增'\0'。c_str()返回一個以‘\0’結尾的字元陣列。copy()把字串內容複製到已有的c_string或字元陣列內。

5.大小和容量函式

(a)現有的字元數:size()和length()。empty()用來檢查串是否為空。

(b)max_size()這個大小是指當前c++串最多包含的字元數,和機器有關,我們不用關心。

(c)capacity()重新分配之前string所包含的最大字元數。這裡需要另一個函式reserve(),為string重新分配記憶體。大小由其引數決定,預設0,這會對string進行非強制性縮減。

6.元素存取

[ ],at()(0~s.length()-1)

string str(“string”)

str[3];str.at(3);

7.比較函式

(>,>=,<,<=,==,!=)

另一個功能強大比較函式compare(),返回一個整數表示比較結果,0:相等;>0: 大於;<0:小於。

string s(“abcd”);

s.compare(“abcd”)返回0

s.compare(“dbca”)返回>0值

s.compare(“ab”)返回<0值

s.compare(0,2,s,2,2);用ab和cd進行比較

8.改變內容

首先:賦值

=:

s=ns,s=“gaint”,s=‘j’。

assign():

s.assign(str);

s.assign(str,1,3);

s.assign(str,2,string::npos)把字串str從索引值2到結尾賦給s

s.assign(“gaint”);

s.assign(“nico”,5);

s.assign(5,‘x’)把5個x賦給s。

把字串清空方法:s="";s.clear();s.erase()。

string提供很多函式:插入(insert),刪除(erase),替換(replace),增加字元(+=,append(),push_back())。

s+=str;

s+="my ";

s+='a';

s.append(str);

s.append(str,1,3);

s.append(str,2,string::npos);

s.append("my");

s.append("nico",5);

s.append(5,'x');

 下面我們首先從一些示例開始學習下string類的使用.
1)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s("hehe");
    cout<<s<<endl;
    cin.get();
}
2)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    char chs[] = "hehe";
    string s(chs);
    cout<<s<<endl;
    cin.get();
}
3)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    char chs[] = "hehe";
    string s(chs,1,3);    //指定從chs的索引1開始,最後複製3個位元組
    cout<<s<<endl;
    cin.get();
}
4)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s1("hehe");
    string s2(s1);    
    cout<<s2<<endl;
    cin.get();
}
5)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s1("hehe",2,3);
    string s2(s1);    
    cout<<s2<<endl;
    cin.get();
}
6)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    char chs[] = "hehe";
    string s(chs,3);    //將chs前3個字元作為初值構造
    cout<<s<<endl;
    cin.get();
}
7)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s(10,'k');    //分配10個字元,初值都是'k'
    cout<<s<<endl;
    cin.get();
}
//以上是string類例項的構造手段,都很簡單.

9)
//賦新值
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s(10,'k');    //分配10個字元,初值都是'k'
    cout<<s<<endl;
    s = "hehehehe";
    cout<<s<<endl;
    s.assign("kdje");
    cout<<s<<endl;
    s.assign("fkdhfkdfd",5);    //重新分配指定字串的前5的元素內容
    cout<<s<<endl;        
    cin.get();
}
10)
//swap方法交換
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s1 = "hehe";
    string s2 = "gagaga";
    cout<<"s1 : "<<s1<<endl;
    cout<<"s2 : "<<s2<<endl;
    s1.swap(s2);
    cout<<"s1 : "<<s1<<endl;
    cout<<"s2 : "<<s2<<endl;
    cin.get();
}
11)
//+=,append(),push_back()在尾部新增字元
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s = "hehe";
    s += "gaga";
    cout<<s<<endl;
    s.append("嘿嘿");    //append()方法可以新增字串
    cout<<s<<endl;
    s.push_back('k');    //push_back()方法只能新增一個字元...
    cout<<s<<endl;
    cin.get();
}
12)
//insert() 插入字元.其實,insert運用好,與其他的插入操作是一樣的.
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s = "hehe";
    s.insert(0,"頭部");            //在頭部插入
    s.insert(s.size(),"尾部");    //在尾部插入
    s.insert(s.size()/2,"中間");//在中間插入
    cout<<s<<endl;
    cin.get();
}
13)
#include <string>
#include <iostream>
using namespace std;

void main()
{
    string s = "abcdefg";
    s.erase(0,1);    //從索引0到索引1,即刪除掉了'a'
    cout<<s<<endl;
    //其實,還可以使用replace方法來執行刪除操作
    s.replace(2,3,"");//即將指定範圍內的字元替換成"",即變相刪除了
    cout<&