string 字串
常用函式
substring()
string.length()&&string.size()
string.find()
string.replace()
string.substr()
string初始化和宣告
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1; //空字串
string str2="hello, world"; //注意中間有空格和‘,’逗號
//透過str2賦值給str3
string str3=str2;
//初始化重複的字母
stirng str4(5,'C'); // str4="CCCCC"
return 0;
}
獲取字串的長度
string.length()&&string.size()
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="hello,, world";
int len=str1.length();
int len1=str1.size();
cout<<len<<len1; //輸出13 包括2個逗號和一個空格
return 0;
}
length()
和size()
返回的是無符號整數(0,1,2...) 使用時儘量用 (int)str1.length()
進行強轉
字串查詢
string.find()
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="hello,, world";
int x=str1.find(" world"); //用int 替代 size_t (無符合整數)
cout<<x; //輸出7 空格的下標是7
int y=str1.find(" 2world");
cout<<y;//輸出的-1;
}
找到相應的子串會返回子串中第一個char在字串中的下標,如果沒有找到會返回 -1 ;
字串拼接
+ || append()
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="hello";
string str2="world"
string str3(5,'Z');
// 用+進行拼接
string re1=str1+str2+str3;
cout<<re1; //輸出helloworldZZZZZ
//用append()
string re2=str1.append(str2).append(str3).append("!");
cout<<re2; //輸出helloworldZZZZZ!
}
**+ 拼接時可用char拼接,但在append()中的引數只能是string型別,不能是char **
string re1=str1+str2+str3+'!'+"2313";
cout<<re1;//輸出helloworldZZZZZ!2313
string re2=str1.append(str2).append(str3).append('!');//append('!')會報錯
字串替換
string.replace()
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="hello,, world";
str1.replace(7,3,"333444");//7代表從下標為7的元素開始‘ ’,3代表要替換的長度(” wo“)
cout<<str1;//輸出 hello,,333444rld
}
提取子字串
substr()
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="hello,, world";
string re1=str1.substr(2,4); //2表示從下標2開始,4表示提取子字串的長度;
cout<<re1;//輸出 llo,
}
字串比較
compare()
#include<bits/stdc++.h>
using namespace std;
int main(){
string str1="hello,,world";
string str2="heooll";
int in=str1.compare(str2); // 比較到下標為2時,'l'<'o' 所以返回-1
cout<<in;//輸出-1 str1比str2小
// 用<,>,== 來比較字串大小
int re1=str1<str2;
int re2=str1==str2;
int re3=str1>str2;
cout<<re1<<re2<<re3;//輸出 1 0 0
}
字串的比較不是越長就越大,比較時會從第一個元素進行一一對應的比較,如果有不相同的元素就會馬上得出結果;
用re=str1.compare(str2)
- re==0 字串相等
- re<0 str1較小
- re>0 str2較大
用 <,>,== 比較 re=str1<str2
- re=1 str1小於str2
- re=0 str1不小於str2
二分查詢(庫函式)
庫函式只能對陣列進行二分查詢,而且必須為單調的
binary_search()
lower_bound()
(常用)upper_bound()
binary_search()
用於對已排序的序列(陣列或容器)中查詢特定的元素
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>nums={1,3,5,7,9};
int target=5;
//用binary_search()函式進行查詢
bool found=binary_search(nums.begin(),nums.end(),target);
if (found){
cout<< "already found";
}else{
cout<<"not found!";
}
cout<<found;//輸出1;
return 0;
}
該函式會返回一個bool
型別的值
lower_bound()
和upper_bound()
使用前提:陣列必須為非降序,即採用單調不減進行排序
lower_bound(st,ed,x)會返回地址[st,ed)中第一個大於等於x的元素的地址
upper_bound(st,ed,x)會返回地址[st,ed)中第一個大於x的元素的地址
如果不存在則返回最後一個元素的下一個位置,在vector中為end()的地址
#include<bits/stdc++.h>
using ll=long long;
using namespace std;
const ll N=5050;
int main() {
vector<ll> r;
ll n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
ll a;
cin >> a;
r.push_back(a);
}
vector<ll> x;
for (int j = 0; j < m; j++) {
ll b;
cin >> b;
x.push_back(b);
}
sort(r.begin(),r.end());//先對vector裡面的元素進行排序
for(int i=0;i<m;i++) {
auto low = lower_bound(r.begin(), r.end(), x[i]);//用lower_bound返回要查詢的元素位置的地址
if (low == r.end() || *(low) != x[i]) {
//如果low==r.end()說明未找到返回的是end()的地址或者未找到目標則會返回第一個大於x[i]的地址
cout << -1<<" " ;
continue;
}
cout << (low - r.begin())+1 <<" ";//用low的地址-r.begin()的地址=low的下標位置
}
return 0;
}
如果 x[i]
不存在於 r
中,lower_bound
將返回指向第一個大於 x[i]
的元素的迭代器(如果存在的話);如果所有元素都小於 x[i]
,則返回 r.end()
。
大寫轉小寫(庫函式)
islower()
isupper()
tolower()
toupper()
Ascii碼
十進位制 | 字元 | 十進位制 | 字元 | 十進位制 | 字元 | 十進位制 | 字元 |
---|---|---|---|---|---|---|---|
48 | 0 | 65-97 | A-a | 75-107 | K-k | 85-117 | U-u |
49 | 1 | 66-98 | B-b | 76-108 | L-l | 86-118 | V-v |
50 | 2 | 67-99 | C-c | 77-109 | M-m | 87-119 | W-w |
51 | 3 | 68-100 | D-d | 78-110 | N-n | 88-120 | X-x |
52 | 4 | 69-101 | E-e | 79-111 | O-o | 89-121 | Y-y |
53 | 5 | 70-102 | F-f | 80-112 | P-p | 90-122 | Z-z |
54 | 6 | 71-103 | G-g | 81-113 | Q-q | ||
55 | 7 | 72-104 | H-h | 82-114 | R-r | ||
56 | 8 | 73-105 | I-i | 83-115 | S-s | ||
57 | 9 | 74-106 | J-j | 84-116 | T-t |
利用Ascii碼進行大小寫互轉
#include<bits/stdc++.h>
using namespace std;
int main(){
string s ;
cin>>s;
for(auto &i:s){
if (i>='A'&&i<='Z')i=i-'A'+'a';//大寫轉小寫
else if (i>='a'&&i<='z')i=i-'a'+'A';//小寫轉大寫
}
//或者
/*for(auto &i:s){
if (i>=65&&i<=90)i=i-'A'+'a';//大寫轉小寫
else if (i>=97&&i<=122)i=i-'a'+'A';//小寫轉大寫
} */
cout<<s;
return 0;
}
tolower()
,toupper()大小寫互轉
#include<bits/stdc++.h>
using namespace std;
char change(char x){
if(islower(x))x=toupper(x);//判斷是小寫 則轉為大寫
else if(isupper(x))x=tolower(x);//判斷是大寫 則轉為小寫
return x;
}
int main(){
string s ;
cin>>s;
for(auto &i:s)i=change(i);
cout<<s;
return 0;
}
islower(x)
會返回bool
型別
toupper(x)
會將小寫轉換為大寫,如果不是小寫字母則不會執行任何操作
islower()
,isupper(x)
判斷是否為小寫或大寫
#include<bits/stdc++.h>
using namespace std;
int main(){
char s ;
cin>>s;
if(islower(s))cout<<"是小寫";
else if(isupper(s))cout<<"是大寫";
cout<<s;
return 0;
}
排序(庫函式)
sort()
sort()
採用的是類似快排的演算法,時間複雜度是O(nlogn)
,返回void
#include<bits/stdc++.h>
using namespace std;
//const N=1e5+5;
//int arr[N];
int main(){
int arr[]={7,4,8,1,9,3,5};
int size=sizeof(arr)/sizeof(int);
sort(arr,arr+size);
for(auto i:arr)cout<<i;
//或者用vector容器中的迭代器
vector<int>p={7,4,8,1,9,3,5};
sort(p.begin(),p.end()) ;
for(auto i:p)cout<<i;
return 0;
}
ps:sort()
可以用第三個引數進行自定義比較,可傳入一個函式,會一一的執行傳入的函式
最值查詢
min()
,max()
min_element()
,max_element()
nth_element()
min(),max()
max(x,y)和min()只能傳入2個引數或者一個列表,返回void
#include<bits/stdc++.h>
using namespace std;
int main(){
//傳入2個引數
cout<<max(4,5);//==5
//傳入列表
cout<<min({1,23,4,5,});//==1
return 0;
}
max_element
(),min_element()
max_element(st,ed)
,min_element(st,ed)
函式會返回最大或最小那個元素的地址(迭代器)
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[]={1,23,4,5,6};
cout<<a[max_element(a,a+5)-a];//23
cout<<a[min_element(a,a+5)-a];//1
//也可用vector
vector<int>p={1,23,4,5,6};
cout<<p[max_element(p.begin(),p.end())-p.begin()];//23
return 0;
}
nth_element()
進行部分排序,返回void
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>p={1,4,2,6,7,8};
nth_element(p.begin(),p.begin()+2,p.end());//對[p.begin(),p.begin()+2]範圍內排序
for(auto i:p)cout<<i<<" ";//輸出2 1 4 6 7 8
return 0;
}
全排列(庫函式)
next_permutation()
prev_permutation()
next_permutation()
next_permutation(st,ed)
用於生成當前序列的下一個序列,如果存在下一個序列則會將當前序列更改為下一個序列,並且返回true
,如果不存在則會將當前的序列更改為第一個序列,並且返回false
,一般第一序列是最小序列
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>p={1,4,2,3};
sort(p.begin(),p.end());//一般先進行排序,使其為最小序列 1234
next_permutation(p.begin(),p.end());//排一次
for(auto i:p)cout<<i<<" ";//輸出1243
return 0;
}
輸出全排列
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>p={1,3,2};
sort(p.begin(),p.end());//排序 1 2 3
for(auto i:p)cout<<i<<" ";
cout<<endl;
while(next_permutation(p.begin(),p.end())){
for(auto i:p)cout<<i<<" ";
cout<<endl;
}
/*輸出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1*/
for(auto i:p)cout<<i<<" ";//最後序列會回到一個序列,輸出123
return 0;
}
prev_permutation()
prev_permutation(st,ed)
用於生成當前序列的上一個序列,如果存在上一個序列則會將當前序列更改為上一個序列,並且返回true
,如果不存在則會將當前的序列更改為第最後個序列,並且返回false
****,一般第一序列是最大序列
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>p={1,3,2};
sort(p.begin(),p.end());//排序 123
reverse(p.begin(),p.end());//逆轉為321 使第一個序列為最大序列
for(auto i:p)cout<<i<<" ";
cout<<endl;
while(prev_permutation(p.begin(),p.end())){
for(auto i:p)cout<<i<<" ";
cout<<endl;
}
for(auto i:p)cout<<i<<" ";//最後的序列會變回為第一個序列 即最大的序列
/*
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
3 2 1*/
return 0;
}
其他庫函式
memset()
swap()
reverse()
unique()
memset()
一般用於初始化陣列中的元素值
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[10];
//將陣列a初始化為0;
memset(a,0,sizeof a);
for(auto i:a)cout<<i;
return 0;
}
swap()
用於交換2個變數的值,返回void
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=2,b=4;
swap(a,b);//交換a,b a=4,b=2;
cout<<a<<b;
return 0;
}
reverse()
reverse(st,ed)用於陣列或vector容器中的元素逆轉
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>p={1,2,3,4};
reverse(p.begin(),p.end());//對p中的元素進行逆轉
for(auto i:p)cout<<i;
//輸出4321
return 0;
}
unique()
unique(st,ed)
函式用於對[st,ed)中相鄰元素去重,!!!並且會把重複的元素放回去重元素的後面,然後返回重複元素中第一個元素的地址,由於只會對相鄰元素進行去重,所以要想達到完全去重,使用前需要先排序,可以結合erase()達到完整去重效果
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int>p={1,2,3,3,4,4,2,1};
sort(p.begin(),p.end());
auto gap=unique(p.begin() ,p.end());
//用erase
p.erase(gap,p.end());
for(auto i:p)cout<<i;//1234
//用for迴圈
for(int i=0;i<gap-p.begin();i++) cout<<p[i];//1234
return 0;
}