站在巨人的肩膀上,C++最常用的200個函數

前言

 

當我們需要實現某一個功能的時候,常常需要自己編寫一些代碼才能實現。

有些時候對於常用模塊,我們可以採用他人編寫好的代碼,加快編程效率。

比如進制轉換,與其自己寫個Stack模擬,不如調用itoa()函數一步實現......

本文純本人手打,且原創首發在CSDN

我將根據我的學習進度,不定期更新,若有不足,歡迎指出,謝謝!

 

基本輸入輸出

//輸入
cin>>a;
scanf("%d",&a);
scanf_s("%d",&a); //vs2019
fscanf(in,"%d",&a);
getchar();//獲取一個字符
gets(a);//獲取一行字符串
getline(cin,a);//獲取一行String

//輸出
cout<<b;
printf("%d",b);
puts(b);
putchar(b);
fprintf(out,"%d",b);//輸出到文件

 

函數庫—algorithm

固定數組  int a[] = { 1, 3, 5, 7, 9, 11, 13 };      int b[11] = { 1, 2, 3, 4 };   
用於下列函數測試

//二分查找:
lower_bound(a, a + 7, 7);//返回第一個大於等於7的地址
	upper_bound(a, a + 7, 7);//返回第一個小於等於7的地址
	binary_search(a, a + 7, 8);//若a到a+7有8,返回true 否則返回false

//反轉函數:
	reverse(a, a + 7);//反轉a到a+7的元素

//填充替換函數:
	fill(a, a + 7, 4);//填充函數,把a到a+7全部填充爲4
	copy_backward(a, a + 7, b + 7);//把a數組複製到b,首地址,尾地址,複製後數組的尾地址
	replace(b, b + 4, 3, 5);//把b到b+4中所有3替換成5

//全排列函數:
	next_permutation(b, b + 4);//b數組的下一個排列
	prev_permutation(b, b + 4);//b數組的上一個排列

//排序去重函數:
	stable_sort(a, a + 7, cmp);//按照cmp規則穩定排序a到a+7
	unique(a, a + 7);//去重,返回去重後數組的尾地址
	printf("%d\n", *max_element(a, a + 6));//返回序列a到a+6的最大元素地址

 

函數庫—cstring

固定數組 用於驗證函數。char a[200] = "hello world";     char b[] = "hello acm";

//初始化:
    memset(a, 0, sizeof(a));//初始化 只能0 -1


//取長度:
    int len = strlen(a);//返回a的長度  到'\0'就算結束


//複製:
    strcpy(a, b);//把b賦值給a 覆蓋掉
	memcpy(a, b, 8);//把b賦值給a 覆蓋掉8個長度


//連接:
    strcat(a, b);//把b連接到a後面
	strncat(a, b, 3);//把b的最多3個字符連接到a後面


//比較大小:
	strcmp(a, b);//a>b 返回正數,a<b返回負數,一樣返回0
	strncmp(a, b, 7);//比較a和b的前7位字符 返回規則同上


//查找:
	int xiabiao = strchr(a, 'l') - a;
        //返回a中找字符l出現的首地址 沒有返回NULL
	int xiabiao2 = (char*)memchr(a, 'l', 7) - a;
        //返回a的前7個字符中找字符l出現的首地址 沒有返回NULL
	strspn(a, b);//比較a和b 從第一位開始,返回從頭數相等的長度
	strstr(a, b)-a;//返回b在a首次出現的地址 

 

函數庫—cmath

int a = 1, b = -2, c = 3, d = 4;

double e = 1.1, f = 8.36, g = 2.2, h =3.4;

        e = sqrt(f);//平方根函數 返回根號f
	e = cbrt(f);//立方根函數 返回三次根號f
	e = pow(f, g); //冪函數 返回f的g次方
	e = floor(f);//向下取整 返回f的向下取整的整數
	e = ceil(f);//向上取整 返回f的向上取整的整數
	a = abs(b);//int類型 返回b的絕對值
	e = fabs(f);//double類型 返回f的絕對值
	e = fmod(f, g);//double類型 返回f除以g的餘數
	e = modf(2.36, &f);//把2.36的整數部分賦值給f(有&) 把小數返回給e
	e = frexp(1024.0, &a);
        //把1024.8轉化爲0.5*2^11;0.5返回 11賦值給a,返回的小數範圍[0.5,1)
	e = ldexp(1.0, 3);//返回1.0 *(2^3) 
	e = exp(3);//返回e的3次方     exp(1)就是e的值  acos(-1)就是pai的值
	f = log(666.0);//返回log e (666.0)   以e爲底數
	f = log10(666.0);//返回log 10 (666.0)   以10爲底數
	f = log10(8) / log10(2);// 計算log 2 (8) 運用換底公式
	f = acos(-1);//返回以弧度表示的 -1 的反餘弦
	f = asin(-1);//返回以弧度表示的 -1 的反正弦
	f = atan(-1);//返回以弧度表示的 -1 的反正切
	f = atan2(1, 2); //返回以弧度表示的 1/2 的反正切。1和2的值的符號決定了正確的象限。
	f = cos(1.1);//返回弧度爲1.1的餘弦
	f = sin(1.1);//返回弧度爲1.1的正弦
	f = tan(1.1);//返回弧度爲1.1的正切
	f = cosh(1.1);//返回弧度爲1.1的雙曲餘弦
	f = sinh(1.1);//返回弧度爲1.1的雙曲正弦
	f = tanh(1.1);//返回弧度爲1.1的雙曲正切
	f = hypot(3, 4);//返回以3和4爲直角邊的三角形斜邊長

 

函數庫—string

vector的各種操作都適用於string

//賦值初始化:
    string str = “abcd”;


//比大小:
    string a = "abc";
    string b = "abd";
    cout << a.compare(b) << endl; // -1
//a比b大就返回1,相等返回0,a比b小返回-1
//重載1:compare()參數可以是char[]類型 
//重載2:str1.compare(2,3,str2,0,3) //str1的第二位開始(下標從0開始算),長度3位,和str2第0位開始長度3位比較
//重載3:str1.compare(2,3,str2)
//str1的第二位開始(下標從0開始算),長度3位,和str2整體比較
//重載2中不允許第一二個參數爲空



//連接:
    str1 += str2;


//長度:
    str1.length();
    str1.size();


//String轉char[] :
    string str = "hello world"; 
    const char* a = str.c_str();
    //這個a只能輸出,不能修改

//char[]轉String:
    char a[20] = "hello world!";
    string str = a; //可以直接暴力轉換

//截取:
    str.substr(2, 3);
    //截取字符串str第二位開始的連續三位,下標從0開始,如果超出長度則到字符串結尾結束


//判斷爲空:
    Str.empty(); 是空返回真


//刪除:
    s.erase(0,1); // 從0位置開始 刪除1個字符

 

STL通用庫函數

 

二分查找函數:equal_range

用法:

equal_range是C++ STL中的一種二分查找的算法,試圖在已排序的[first,last)中尋找value,它返回一對迭代器i和j,其中i是在不破壞次序的前提下,value可插入的第一個位置(亦即lower_bound),j則是在不破壞次序的前提下,value可插入的最後一個位置(亦即upper_bound),因此,[i,j)內的每個元素都等同於value,而且[i,j)是[first,last)之中符合此一性質的最大子區間。

pair<set<int>::iterator, set<int>::iterator > p = equal_range(s.begin(), s.end(), 4);
//查找4這個元素

求i和j的距離:

distance(p.first, p.second),//若STL中不存在則返回0;否則存在

求i和j迭代器指向的值:

*p.first  << " " << *p.second

 

Find_if函數:

用法:從begin開始 ,到end爲止,返回第一個讓 func這個函數返回true的iterator。

 

求最大最小值:

max_element(v.begin(),v.end());//返回v容器中的最大值的迭代器

min_element(v.begin(),v.end());//返回v容器中的最小值的迭代器

 

STL之set

 

//定義: 
    set<int>s;


//插入數據: 
    s.insert(6);


//刪除數據:
    s.erase(1);//刪除集合中爲1的所有元素
    s.clear();//全部刪除


//遍歷輸出:
    for (set<int>::iterator it = s.begin(); it != s.end(); it++) {
     cout << *it << endl;
    }


//查找:
    s.count(1);//有返回true, 沒有返回false
    cout << *s.find(1)<< endl;
    //find函數返回一個迭代器,取值需要加*,找不到返回end();


//元素個數:
     s.size(); 


//判斷爲空: 
    s.empty();


//迭代器相關:
    s.find();//返回一個迭代器,取值需要加*,找不到返回end();
    s.equal_range() // 返回集合中與給定值相等的上下限的兩個迭代器
    s.lower_bound()//返回指向⼤於(或等於)某值的第⼀個元素的迭代器
    s.upper_bound() // 返回⼤於某個值元素的迭代器


//反向迭代遍歷:
    set<int>::reverse_iterator iter = s1.rbegin(); 
    for(iter;iter!=s1.rend();iter++)
    {
        cout<<*iter<<" "; 
    }


//可重複的set集合:
    multiset<int>ss; 功能同set其中count(i)返回元素的個數

STL之map

//創建: 
    map<string, int>m;

//插入數據:
    m.insert(map<string, int>::value_type("he", 2));
    // insert函數返回一個pair,其first指向插入元素的迭代器;
    // 若原本插入的鍵不存在,second返回true,若原本存在,second返回false
    m["ha"] = 3;


//遍歷:
    for (map<string, int>::iterator it = m.begin(); it != m.end(); it++) {
        cout << it->first << "  " << it->second << endl;
    }

//查找:
    map<string, int>::iterator it = m.find("he"); //找不到返回m.end();

//刪除:
    m.erase("he");//刪除鍵的值,返回被刪除的個數(普通map爲1)

//元素個數:
    m.size();

//判斷爲空:
    m.empty();

//清空:
    m.clear();


//map自定義排序:
    struct cmp {
        bool operator()(int const& a, int const& b)const {
            return a>b;
        }
    };
    multimap<int, int, cmp>m;
	m.insert(pair<int, int>(1, 2));
	m.insert(pair<int, int>(2, 3));
	m.insert(pair<int, int>(3, 4));

	for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) {
		cout << it->first << " " << it->second << endl;
	}

STL之vector

//定義: 
    vector<int>v;


//插入元素:
    v.push_back(i); 
    v.push_back(it,i);//在迭代器it前插入i
    v.push_back(it,n,i);//在迭代器it前插入n個元素i

//尾部刪除: 
    v.pop_back();

//首位元素:
    v.front();  
 
//尾部元素:
    v.back();

//判斷爲空:
    v.empty();

//元素個數: 
    v.size();

//遍歷:
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
        cout << *it << endl;
    }

//翻轉:
    reverse(v.begin(), v.end());

//排序:
    sort(v.begin(), v.end());
    sort(v.begin(), v.end(), cmp);

//交換容器:
    v.swap(v2);

//設置空間大小:
    v.resize(n);//設置長度爲n

STL之queue

//普通隊列:
        queue<int>q;//創建
	q.size();//返回元素個數
	q.empty();//返回是否爲空
	q.push(3);  //插入元素3,入隊
	q.pop();    //刪除最上方元素,出隊
	q.front();   //返回隊首元素
	q.back();   //返回隊尾元素

//優先隊列:

//1.默認優先級:定義:
    priority_queue<int>q;//默認大的數優先


//2. 傳入一個比較函數,使用functional.h函數對象作爲比較函數
    priority_queue<int,vector<int>, greater<int> > q;//自定義小的數優先


//3. 傳入比較結構體,自定義優先級:
    struct cmp
    {
	    bool operator()(int x,int y) {
    		return x > y;//當前爲小的數優先
	    }
    };
    priority_queue<int,vector<int> ,cmp>q;


//4. 自定義數據結構,自定義優先級//最快的一種

    struct ss {
	    int x, y;
	    ss(int xx, int yy) {
	    	x = xx;
	    	y = yy;
	    }
	    friend bool operator < (const ss& a, const ss& b) {
    		if (b.x != a.x) return b.x < a.x;
	    	return b.y < a.y;
    	}
    };
    priority_queue<ss>q;

STL之stack

//定義:
    stack<int>s;

//常用函數:

    empty(); //堆棧爲空則返回真
    pop(); //移除棧頂元素
    push(); //在棧頂增加元素
    size(); //返回棧中元素數目
    top(); //返回棧頂元素


//假設內置結構體有構造函數,則以下兩句等價:
    s.push(ss(1, 2));
    s.emplace(1, 2);//免構造


    s.swap(ss)可以互換兩個棧的元素

STL之pair

//頭文件:
    #include<utility>

//定義:
    pair<int, string>p;

//定義且初始化:
    pair<int, string>p(2,"hello");
    pair<int, string>p;
    p = make_pair(2, "hello");

//返回鍵:
    p.first

//返回值:
    p.second

//比較:
    p = make_pair(2, "hello");
	pp = make_pair(2, "hello");
	cout << (p == pp) << endl;//相等 返回true

    p = make_pair(1, "hello");
	pp = make_pair(2, "hello");
	cout << (p < pp) << endl;//p比pp小 返回true

//遵循字典序順序,先比first,再比second

輸入掛

const int MAXBUF = 10000;
char buf[MAXBUF], * ps = buf, * pe = buf + 1;
inline void rnext()
{
	if (++ps == pe)
		pe = (ps = buf) + fread(buf, sizeof(char), sizeof(buf) / sizeof(char), stdin);
}

template <class T>
inline bool in(T& ans)
{
	ans = 0;
	T f = 1;
	if (ps == pe) return false;
	do {
		rnext();
		if ('-' == *ps) f = -1;
	} while (!isdigit(*ps) && ps != pe);
	if (ps == pe) return false;
	do
	{
		ans = (ans << 1) + (ans << 3) + *ps - 48;
		rnext();
	} while (isdigit(*ps) && ps != pe);
	ans *= f;
	return true;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章