C++常見函式的基礎演算法

zpa666發表於2024-11-12

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()

用於對已排序的序列(陣列或容器)中查詢特定的元素

#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;
} 

相關文章