C++之string基本字符系列容器
阿新 • • 發佈:2019-01-22
using rtt 對象的比較 負數 字符指針 string對象 很多 ret c_str string基本字符系列容器
C語言只提供了一個插入類型用來處理字符, 而對於字符串, 只能通過字符串數組來處理, 顯得十分不便. C++STL提供了string基本字符系列容器來處理字符串, 可以把string理解為字符串類, 它提供了添加, 刪除, 替換, 查找和比較等豐富的方法.
雖然使用vector<char>這樣的向量也可以處理字符串, 但功能比不上string. 向量的元素類型可以是string, 如vector<string>這樣的向量, 實際上就類似於C語言中的字符串數組.
使用string容器, 需要頭文件包含聲明"#include<string>"
1.1創建string對象
下面這條語句創建了字符串對象s, s是一個空字符串, 其長度為0:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s;
cout << s.length() << endl;
return 0;
}
1.2給string對象賦值
給string對象賦值一般有兩種方式
(1)直接給字符串對象賦值, 如:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "hello, C++STL.";
cout << s << endl;
return 0;
}
(2)更常用的方法是, 把字符指針賦給一個字符串對象:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
char ss[5000];
//scanf的輸入速度比cin快得多
//scanf是C語言的函數, 不支持string對象
scanf("%s", &ss);
//把整個字符數組賦值給string對象
s = ss;
//輸出字符對象
cout << s << endl;
return 0;
}
1.3從string對象尾部添加字符
在string對象的尾部添加一個字符(char), 采用"+"操作符即可, 具體應用如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = s + ‘a‘;
s = s + ‘b‘;
s = s + ‘c‘;
cout << s << endl;
return 0;
}
1.4從string對象尾部追加字符串
從尾部追加的方式有兩種
(1)直接采用"+"操作符, 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = s + "abc";
s = s + "123";
cout << s << endl;
return 0;
}
(2)采用append()方法, 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s.append("abc");
s.append("123");
cout << s << endl;
return 0;
}
1.5給string對象插入字符
可以使用insert()方法把一個字符插入到叠代器位置之前, 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "123456";
//定義叠代器
string::iterator it;
//叠代器位置為字符串首
it = s.begin();
//把字符‘p‘插入到第一個字符前(註意, 字符位置是從0開始計數)
s.insert(it + 1, ‘p‘);
cout << s << endl;
return 0;
}
1.6訪問string對象的元素
一般使用下標方式隨機訪問string對象的元素, 下標是從0開始計數的. 另外, string對象的元素是一個字符(char), 這一點一定要清楚. 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "abc123456";
//輸出string對象的首元素
cout << s[0] << endl;
//兩個相同的字符相減值為0
cout << s[0] - ‘a‘ << endl;
return 0;
}
1.7刪除string對象的元素
(1)清空一個字符串, 則直接給它賦空字符串即可.
(2)使用erase()方法刪除叠代器所指的那個元素或一個區間中的所有元素. 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "abc123456";
//定義叠代器變量, 指向字符串對象的首元素
string::iterator it = s.begin();
//刪除第3個元素, 元素位置從0開始計數
s.erase(it + 3);
cout << s << endl;
//刪除0~4區間的所有元素
s.erase(it, it + 4);
cout << s << endl;
//清空字符串
s = "";
//輸出字符串的長度
cout << s.length() << endl;
return 0;
}
1.8返回string對象的長度
采用length()方法可返回字符串的長度; 采用empty()方法, 可返回字符串是否為空, 如果字符串為空, 則返回邏輯真, 即1, 否則, 返回邏輯假, 即0. 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "abc123456";
//輸出字符串的長度
cout << s.length() << endl;
//清空字符串
s = "";
//判斷字符串是否為空
cout << s.empty() << endl;
return 0;
}
1.9替換string對象的字符
使用replace()方法很方便的替換string對象中的字符, replace()方法的重載函數相當多, 常用的只有一兩個, 具體代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "abc123456";
//從第3個開始, 將連續的3個字符替換為"good"
//即將"abc"替換為"good"
s.replace(3, 3, "good");
cout << s << endl;
return 0;
}
/*
abcgood456
*/
1.10搜索string對象的元素或字串
采用find()方法可查找字符串中的第一個字符元素(char, 用單引號界定)或者子串(用雙引號界定), 如果查到, 則返回下標值(從0開始計數), 如果查不到, 則返回4294967295.
find()方法有很多重載函數, 下面的代碼, 僅舉出了一種用法.
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "cat dog cat";
//查找第一個字符‘c‘, 返回下標值
cout << s.find(‘c‘) << endl;
//查找第一個子串"c", 返回下標值
cout << s.find("c") << endl;
//查找第一個子串"cat", 返回下標值
cout << s.find("cat") << endl;
//查找第一個子串"dog", 返回下標值
cout << s.find("dog") << endl;
//查找第一個子串"dogc", 查不到則返回4294967295
cout << s.find("dogc") << endl;
return 0;
}
/*
0
0
0
4
18446744073709551615
*/
1.11string對象的比較
string對象可以使用compare()方法與其他字符串相比較. 如果它比對方大, 則返回1(整數); 如果它比對方小, 則返回-1(負數); 如果它與對方相等, 則返回0. 代碼如下:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "cat dog cat";
//s比"cat"字符串大, 返回1
cout << s.compare("cat") << endl;
//s與"cat dog cat"相等, 返回0
cout << s.compare("cat dog cat") << endl;
//s比"dog"小, 返回-1
cout << s.compare("dog") << endl;
return 0;
}
/*
8
0
-1
*/
1.12用reverse反向排序string對象
采用reverse()方法可將string對象叠代器所指向的一段區間中的元素(字符)反向排序.
reverse()方法需要聲明頭文件"#include<algorithm>". 代碼如下:
#include<string>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "123456789";
reverse(s.begin(), s.end());
cout << s << endl;
return 0;
}
/*
987654321
*/
1.13string對象作為vector元素
string對象可以作為vector向量的元素, 這種用法, 類似於字符串數組, 代碼如下:
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
vector<string> v;
v.push_back("Jack");
v.push_back("Mike");
v.push_back("Tom");
cout << v[0] << endl;
cout << v[1] << endl;
cout << v[2] << endl;
cout << v[0][0] << endl;
cout << v[1][0] << endl;
cout << v[2].length() << endl;
return 0;
}
/*
Jack
Mike
Tom
J
M
3
*/
1.14string類型的數字化處理
在ACM競賽中, 常常需要將讀入的數字的每位分離出來, 如果采用取余的方法, 花費的時間就會很長, 這時候, 我們可以將讀入的數據當成字符串來處理, 這樣就方便, 省時多了, 下面這個程序演示了求一個整數各位的和:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
s = "123456789";
int i;
int sum = 0;
for(i = 0; i < s.length(); ++i)
{
if(s[i] == ‘0‘) sum += 0;
else if(s[i] == ‘1‘) sum += 1;
else if(s[i] == ‘2‘) sum += 2;
else if(s[i] == ‘3‘) sum += 3;
else if(s[i] == ‘4‘) sum += 4;
else if(s[i] == ‘5‘) sum += 5;
else if(s[i] == ‘6‘) sum += 6;
else if(s[i] == ‘7‘) sum += 7;
else if(s[i] == ‘8‘) sum += 8;
else if(s[i] == ‘9‘) sum += 9;
}
cout << sum << endl;
return 0;
}
/*
45
*/
1.15string對象與字符數組互操作
下面這個程序演示了字符數組與string對象的輸入與輸出:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s;
char ss[100];
//輸入字符串到字符數組中
scanf("%s", &ss);
//字符數組賦值給字符串對象
s = ss;
//用printf輸出字符串對象, 要采用c_str()方法
printf(s.c_str());
cout << endl;
printf("%s", ss);
cout << endl;
cout << s << endl;
cout << ss << endl;
return 0;
}
/*
input:
abc123
output:
abc123
abc123
abc123
abc123
*/
1.16string對象與sscanf函數
在C語言中, sscanf函數很管用, 它可以把一個字符串按你需要的方式分離出子串, 甚至是數字
下面這個程序演示了sscanf函數的具體用法:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string s1, s2, s3;
char sa[100], sb[100], sc[100];
//將字符串分離成子串, 分隔符為空格
sscanf("abc 123 pc", "%s %s %s", sa, sb, sc);
s1 = sa;
s2 = sb;
s3 = sc;
cout << s1 << " " << s2 << " " << s3 << endl;
//將字符串分離成數字, 分隔符為空格
//當用到數字的時候, 跟scanf一樣, 它要傳指針地址
int a, b, c;
sscanf("1 2 3", "%d %d %d", &a, &b, &c);
cout << a << " " << b << " " << c << endl;
//將字符串分離成數字, 分隔符為","和"$"
//當用到數字的時候, 跟scanf一樣, 它要傳指針地址
int x, y, z;
sscanf("4,5$6", "%d,%d$%d", &x, &y, &z);
cout << x << " " << y << " " << z << endl;
return 0;
}
/*
abc 123 pc
1 2 3
4 5 6
*/
1.17string對象與數值相互轉換
有時候, string對象與數值之間需要相互轉換, 下面這個例子詳細說明了如何完成該工作的:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
//C++方法: 將數值轉換為string
string convertToString(double x)
{
ostringstream o;
if(o << x)
return o.str();
return "conversion error";//if error
}
//C++方法: 將string轉換為數值
double convertFromString(const string &s)
{
istringstream i(s);
double x;
if(i >> x)
return x;
return 0.0;//if error
}
int main()
{
//將數值轉換為string的第一種方法: C方法
char b[10];
string a;
sprintf(b, "%d", 1975);
a = b;
cout << a << endl;
//將數值轉換為string的第二種方法: C++方法
string cc = convertToString(1976);
cout << cc << endl;
//將string轉換為數值的方法: C++方法
string dd = "2006";
int p = convertFromString(dd) + 2;
cout << p << endl;
return 0;
}
/*
1975
1976
2008
*/
C++之string基本字符系列容器