c++中string的常用函數+用法歸納
一. 基本形式
string str:生成空字符串
string s(str):生成字符串為str的復制品
string s(str, strbegin,strlen):將字符串str中從下標strbegin開始、長度為strlen的部分作為字符串初值
string s(cstr, char_len):以C_string類型cstr的前char_len個字符串作為字符串s的初值
string s(num ,c):生成num個c字符的字符串
string s(str, stridx):將字符串str中從下標stridx開始到字符串結束的位置作為字符串初值
eg:
string str1; //生成空字符串
string str2("123456789"); //生成"1234456789"的復制品
string str3("12345", 0, 3);//結果為"123"
string str4("012345", 5); //結果為"01234"
string str5(5, '1'); //結果為"11111"
string str6(str2, 2); //結果為"3456789"
二. string的大小
- size()和length():返回string對象的字符個數,他們執行效果相同。
- max_size():返回string對象最多包含的字符數,超出會拋出length_error異常
三.字符串比較
-
C ++字符串支持常見的比較操作符(>,>=,<,<=,==,!=),甚至支持string與C-string的比較(如 str<”hello”)。
在使用>,>=,<,<=這些操作符的時候是根據“當前字符特性”將字符按字典順序進行逐一得 比較。字典排序靠前的字符小,
比較的順序是從前向后比較,遇到不相等的字符就按這個位置上的兩個字符的比較結果確定兩個字符串的大小(前面減后面)
同時,string (“aaaa”) <string(aaaaa)。 -
另一個功能強大的比較函數是成員函數compare()。他支持多參數處理,支持用索引值和長度定位子串來進行比較。
他返回一個整數來表示比較結果,返回值意義如下:0:相等 1:大於 -1:小於 (A的ASCII碼是65,a的ASCII碼是97)
// 前面減去后面的ASCII碼,>0返回1,<0返回-1,相同返回0
string A("aBcd");
string B("Abcd");
string C("123456");
string D("123dfg");
// "aBcd" 和 "Abcd"比較------ a > A
cout << "A.compare(B):" << A.compare(B)<< endl; // 結果:1
// "cd" 和 "Abcd"比較------- c > A
cout << "A.compare(2, 3, B):" <<A.compare(2, 3, B)<< endl; // 結果:1
// "cd" 和 "cd"比較
cout << "A.compare(2, 3, B, 2, 3):" << A.compare(2, 3, B, 2, 3) << endl; // 結果:0
// 由結果看出來:0表示下標,3表示長度
// "123" 和 "123"比較
cout << "C.compare(0, 3, D, 0, 3)" <<C.compare(0, 3, D, 0, 3) << endl; // 結果:0
四.string的插入 (與vetor容器類似)

{
string s1;
// 尾插一個字符
s1.push_back('a');
s1.push_back('b');
s1.push_back('c');
cout<<"s1:"<<s1<<endl; // s1:abc
// insert(pos,char):在制定的位置pos前插入字符char
s1.insert(s1.begin(),'1');
cout<<"s1:"<<s1<<endl; // s1:1abc
}
五.string拼接字符串:append() & + 操作符*
basic_string &append( const char *str );
basic_string &append( const basic_string &str, size_type index, size_type len );
basic_string &append( const char *str, size_type num );
basic_string &append( size_type num, char ch );
basic_string &append( input_iterator start, input_iterator end );
在字符串的末尾添加str,
在字符串的末尾添加str的子串,子串以index索引開始,長度為len
在字符串的末尾添加str中的num個字符,
在字符串的末尾添加num個字符ch,
在字符串的末尾添加以迭代器start和end表示的字符序列.
{
string str1="I like C++";
string str2=",I like the world.";
string str3="Hello";
string str4("Hi");
//====================================
str1.append(str2);
str3.append(str2, 11, 7);
str4.append(5, '.');
//====================================
cout<<str1<<endl;
cout<<str3<<endl;
cout<<str4<<endl;
system("pause");
return 0;
Hello World.
Hi.....
string 中還有個很常⽤的函數叫做 substr ,作⽤是截取某個字符串中的⼦串,⽤法有兩種形式:
string s2 = s.substr(4); // 表示從下標4開始⼀直到結束
string s3 = s.substr(5, 3); // 表示從下標5開始,3個字符
六. string的刪除:erase()*
1. iterator erase(iterator p);//刪除字符串中p所指的字符
2. iterator erase(iterator first, iterator last);//刪除字符串中迭代器
區間[first,last)上所有字符
3. string& erase(size_t pos = 0, size_t len = npos);//刪除字符串中從索引
位置pos開始的len個字符
4. void clear();//刪除字符串中所有字符
八.string的字符替換:*
1. string& replace(size_t pos, size_t n, const char *s);//將當前字符串
從pos索引開始的n個字符,替換成字符串s
2. string& replace(size_t pos, size_t n, size_t n1, char c); //將當前字符串從pos索引開始的n個字符,替換成n1個字符c
3. string& replace(iterator i1, iterator i2, const char* s);//將當前字符串[i1,i2)區間中的字符串替換為字符串s
4.
void test7()
{
string s1("hello,world!");
cout<<s1.size()<<endl; // 結果:12
s1.replace(s1.size()-1,1,1,'.'); // 結果:hello,world.
// 這里的6表示下標 5表示長度
s1.replace(6,5,"girl"); // 結果:hello,girl.
// s1.begin(),s1.begin()+5 是左閉右開區間
s1.replace(s1.begin(),s1.begin()+5,"boy"); // 結果:boy,girl.
cout<<s1<<endl;
}
九.string里的查找find
void test8()
{
string s("dog bird chicken bird cat");
string s("wlx is a pigdog")
//字符串查找-----找到后返回首字母在字符串中的下標
// 1. 查找一個字符串
cout << s.find("is") << endl; // 結果是:4
// 2. 從下標為6開始找字符'i',返回找到的第一個i的下標
cout << s.find('i',6) << endl; // 結果是:10
// 3. 從字符串的末尾開始查找字符串,返回的還是首字母在字符串中的下標
cout << s.rfind("is") << endl; // 結果是:4
// 4. 從字符串的末尾開始查找字符
cout << s.rfind('i') << endl; // 結果是:10 因為是從末尾開始查找,所以返回第一次找到的字符
// 5. 在該字符串中查找第一個屬於字符串s的字符
cout << s.find_first_of("abc") << endl; // 結果是:7 即a
// 6. 在該字符串中查找第一個不屬於字符串s的字符------先匹配dog,然后bird匹配不到,所以打印4
cout << s.find_first_not_of("wlx shi pig") << endl; // 結果是:7
}
十.sort排序
見我另一篇
另:vetor、queue博客里也有,需要自行瀏覽
sort排序總結+詳細
sort排序總結+詳細
C++中vector和set都是非常方便的容器,
sort方法是algorithm頭文件里的一個標准函數,能進行高效的排序,默認是按元素從小到大排序
將sort方法用到vector和set中能實現多種符合自己需求的排序
首先sort方法可以對靜態的數組進行排序
#include<iostream>
using namespace std;
int main(){
int a[10] = { 9, 0, 1, 2, 3, 7, 4, 5, 100, 10 };
sort(a, a +10);
for (int i = 0; i < 10; i++)
cout << a[i] << endl;
return 0;
}
這里可以看到是sort(a,a+10),但是數組a一共只有9個元素,為什么是a+10而不是a+9呢?
因為sort方法實際上最后一位地址對應的數是不取的,
而且vector,set,map這些容器的end()取出來的值實際上並不是最后一個值,而end的前一個才是最后一個值!
需要用prev(xxx.end()),才能取出容器中最后一個元素。
對vector使用sort函數:
第一種情形:基本類型,如vector,vector,vector也是可以的
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<int> a;
int n = 5;
while (n--){
int score;
cin >> score;
a.push_back(score);
}
//cout <<" a.end()"<< *a.end() << endl; 執行這句話會報錯!
cout << " prev(a.end)" << *prev(a.end()) << endl;
sort(a.begin(), a.end());
for (vector<int>::iterator it = a.begin(); it != a.end(); it++){
cout << *it << endl;
}
return 0;
}
看到了嗎,實際上end的前一個指針指向的元素才是插入時的最后一個值!
排序后從小大大。
第二種情形:用自定義的結構體進行sort算法,
這時候需要自己定義個比較函數,因為sort算法是基於容器中的元素是可以兩兩比較的,然后從小到大排序,所以要自定義怎么樣才是小於(’<’)
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
struct student{
char name[10];
int score;
};
//自定義“小於”
bool comp(const student &a, const student &b){
return a.score < b.score;
}
int main(){
vector<student> vectorStudents;
int n = 5;
while (n--){
student oneStudent;
string name;
int score;
cin >> name >> score;
strcpy(oneStudent.name, name.c_str());
oneStudent.score = score;
vectorStudents.push_back(oneStudent);
}
cout << "===========排序前================" << endl;
for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
cout << "name: " << it->name << " score: " << it->score << endl;
}
sort(vectorStudents.begin(),vectorStudents.end(),comp);
cout << "===========排序后================" << endl;
for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
cout << "name: " << it->name << " score: " << it->score << endl;
}
return 0;
}
不過有時候一個排序條件不夠,比如要求學生按分數從高到低排序,如果分數相同,則按照年齡從大到小排序
就需要在comp自定義函數里面修改一下判斷了,原來是直接return a.score < b.score
現在就需要判斷
if (a.score > b.score)
return true;
else if (a.score == b.score && a.age > b.age)
return true;
else
return false;
這里一定要記得else return false!!!有一次比賽的時候寫到這個函數,有三個判斷條件,結果忘了這茬,總是報錯,
到后來有點着急了就自己手動實現了一下寫了三個比較函數,調用了三次sort函數!!!!!
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
struct student{
char name[10];
int score;
int age;
};
//自定義“小於”
bool comp(const student &a, const student &b){
if (a.score > b.score)
return true;
else if (a.score == b.score && a.age > b.age)
return true;
else ///這里的else return false非常重要!!!!!
return false;
}
int main(){
vector<student> vectorStudents;
/*set<student> setStudents;*/
//int n = 5;
int n = 6;
while (n--){
student oneStudent;
string name;
int score;
int age;
cin >> name >> score>>age;
strcpy(oneStudent.name, name.c_str());
oneStudent.score = score;
oneStudent.age = age;
vectorStudents.push_back(oneStudent);
}
cout << "===========排序前================" << endl;
for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
cout << "name: " << it->name << " score: " << it->score << " age: "<<it->age<<endl;
}
sort(vectorStudents.begin(), vectorStudents.end(), comp);
//sort(setStudents.begin(), setStudents.end());
cout << "===========排序后================" << endl;
for (vector<student>::iterator it = vectorStudents.begin(); it != vectorStudents.end(); it++){
cout << "name: " << it->name << " score: " << it->score << " age: " << it->age << endl;
}
return 0;
}
接下來,對於set做類似的操作。
set是一個集合,內部的元素不會重復,同時它會自動進行排序,也是從小到大
而且set的insert方法沒有insert(a,cmp)這種重載,所以如果要把結構體插入set中,我們就要重載’<'運算符。
set方法在插入的時候也是從小到大的,那么我們重載一下<運算符讓它從大到小排序
#include<iostream>
#include<vector>
#include<set>
#include<string>
#include<algorithm>
using namespace std;
struct student{
char name[10];
int score;
};
//自定義“小於”
bool comp(const student &a, const student &b){
return a.score < b.score;
}
bool operator < (const student & stu1,const student &stu2){
return stu1.score > stu2.score;
}
int main(){
//vector<student> vectorStudents;
set<student> setStudents;
//int n = 5;
int n = 6;
while (n--){
student oneStudent;
string name;
int score;
cin >> name >> score;
strcpy(oneStudent.name, name.c_str());
oneStudent.score = score;
setStudents.insert(oneStudent);
}
cout << "===========排序前================" << endl;
for (set<student>::iterator it = setStudents.begin(); it != setStudents.end(); it++){
cout << "name: " << it->name << " score: " << it->score << endl;
}
//sort(setStudents.begin(), setStudents.end(), comp);
//cout << "===========排序后================" << endl;
//for (set<student>::iterator it = setStudents.begin(); it != setStudents.end(); it++){
// cout << "name: " << it->name << " score: " << it->score << endl;
//}
return 0;
}
我們可以看到,set內元素不會重復,而且它按照它所認為的“從小到大”進行了排序
c++源文件 不同后綴(.cc .cpp .C .cp)的區別
參考了C++ Primer Plus第五版中文版 P8
C++實現 源代碼的擴展名
UNIX C、cc、cxx、c
GNU C++ C、cc、cxx、cpp、c++
Borland C++ Cpp
Microsoft Visual C++ cpp、cxx、cc
Android系統源碼中以cc為后綴