C++常用小技巧個人總結(持續更新)
求任意陣列長度
sizeof(array) / sizeof(array[0]),
※c++多關鍵字排序:
struct node
{
int a;int b;int c;//三重引數
friend bool operator<(const node &x,const node &y)//過載(重新定義)小於號
{
if (x.a<y.a) return true;
if (x.a>y.a) return false;
if (x.b>y.b) return true;
if (x.b<y.b) return false;
if (x.c<y.c) return true;
return false;
}
}d[1001];
主程式中Sort(d+1,d+n+1);//排d中1--n的元素
排序庫函式#include<algorithm>
外部比較函式
檔案
#include<stdlib.h>
freopen("output.txt","w",stdout);
freopen("input.txt","r",stdin);
小數位數輸出(兩位為例):
(1)庫函式#include<iomanip>
輸出前加上:
cout.setf(ios::fixed);
cout.precision(2);
(2)庫函式#include<stdio.h>
使用printf(“%.2lf”,x)
建議無腦開庫
#include<iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
左對齊輸出機佔位:
printf("%-5.3lf",aa):表示double型別的數aa左對齊佔五位保留三位小數輸出
printf("%4.2lf",aa): 表示double型別的數aa右對齊佔四位保留兩位小數輸出
庫函式:stdio.h(c) 或cstdio(c++)
printf()函式是格式化輸出函式, 一般用於向標準輸出裝置按規定格式輸出資訊。
printf()函式的呼叫格式為: printf("<格式化字串>", <參量表>);
其中格式化字串包括兩部分內容:
一部分是正常字元, 這些字元將按原樣輸出;
另一部分是格式化規定字元,
以"%"開始,
後跟一個或幾個規定字元,
用來確定輸出內容格式。
參量表是需要輸出的一系列引數, 其個數必須與格式化字串所說明的輸出引數個數一樣多,
各引數之間用","分開,
且順序一一對應,
否則將會出現意想不到的錯誤。
1. 格式化規定符
——————————————————————————
%d 十進位制有符號整數
%u 十進位制無符號整數
%f 浮點數
%s 字串
%c 單個字元
%p 指標的值
%e 指數形式的浮點數
%x, %X 無符號以十六進位制表示的整數
%0 無符號以八進位制表示的整數
%g 自動選擇合適的表示法
━━━━━━━━━━━━━━━━━━━━━━━━━━
說明:
(1). 可以在"%"和字母之間插進數字表示最大場寬。
例如: %3d 表示輸出3位整型數,
不夠3位右對齊。
%9.2f 表示輸出場寬為9的浮點數,
其中小數位為2,
整數位為6,
小數點佔一位, 不夠9位右對齊。
%8s 表示輸出8個字元的字串,
不夠8個字元右對齊。
如果字串的長度、或整型數位數超過說明的場寬, 將按其實際長度輸出。
但對浮點數, 若整數部分位數超過了說明的整數位寬度,
將按實際整數位輸出;
若小數部分位數超過了說明的小數位寬度, 則按說明的寬度以四捨五入輸出。
另外, 若想在輸出值前加一些0,
就應在場寬項前加個0。
例如: %04d 表示在輸出一個小於4位的數值時,
將在前面補0使其總寬度
為4位。
如果用浮點數表示字元或整型量的輸出格式, 小數點後的數字代表最大寬度,
小數點前的數字代表最小寬度。
例如: %6.9s 表示顯示一個長度不小於6且不大於9的字串。若大於9,
則
第9個字元以後的內容將被刪除。
(2). 可以在"%"和字母之間加小寫字母l,
表示輸出的是長型數。
例如: %ld 表示輸出long整數
%lf 表示輸出double浮點數
(3). 可以控制輸出左對齊或右對齊,
即在"%"和字母之間加入一個"-"
號可
說明輸出為左對齊, 否則為右對齊。
例如: %-7d 表示輸出7位整數左對齊
%-10s 表示輸出10個字元左對齊
2. 一些特殊規定字元
——————————————————————————
\n 換行
\f 清屏並換頁
\r 回車
\t Tab符
\xhh 表示一個ASCII碼用16進表示,
其中hh是1到2個16進位制數
━━━━━━━━━━━━━━━━━━━━━━━━━━
由本節所學的printf()函式,
並結合上一節學習的資料型別,
編制下面的程
序, 以加深對Turbo C2.0資料型別的瞭解。
示例
#include<stdio.h>
#include<string.h>
int main()
{
char c, s[20], *p;
int a=1234, *i;
float f=3.141592653589;
double x=0.12345678987654321;
p="How do you do";
strcpy(s, "Hello, Comrade");
*i=12;
c='\x41';
printf("a=%d\n", a); /*結果輸出十進位制整數a=1234*/
printf("a=%6d\n", a); /*結果輸出6位十進位制數a= 1234*/
printf("a=%06d\n", a); /*結果輸出6位十進位制數a=001234*/
printf("a=%2d\n", a); /*a超過2位,
按實際值輸出a=1234*/
printf("*i=%4d\n", *i); /*輸出4位十進位制整數*i= 12*/
printf("*i=%-4d\n", *i); /*輸出左對齊4位十進位制整數*i=12*/
printf("i=%p\n", i); /*輸出地址i=06E4*/
printf("f=%f\n", f); /*輸出浮點數f=3.141593*/
printf("f=6.4f\n", f); /*輸出6位其中小數點後4位的浮點數
f=3.1416*/
printf("x=%lf\n", x); /*輸出長浮點數x=0.123457*/
printf("x=%18.16lf\n", x);/*輸出18位其中小數點後16位的長浮點
數x=0.1234567898765432*/
printf("c=%c\n", c); /*輸出字元c=A*/
printf("c=%x\n", c); /*輸出字元的ASCII碼值c=41*/
printf("s[]=%s\n", s); /*輸出陣列字串s[]=Hello, Comrade*/
printf("s[]=%6.9s\n", s);/*輸出最多9個字元的字串s[]=Hello,
Co*/
printf("s=%p\n", s); /*輸出陣列字串首字元地址s=FFBE*/
printf("*p=%s\n", p); /* 輸出指標字串p=How do you do*/
printf("p=%p\n", p); /*輸出指標的值p=0194*/
getch();
retunr 0;
}
棧和佇列
使用標準庫的棧和佇列時,先包含相關的標頭檔案
#include<stack>
#include<queue>
定義棧如下:
stack<int> stk;
定義佇列如下:
queue<int> q;
棧提供瞭如下的操作
s.empty() 如果棧為空返回true,否則返回false
s.size() 返回棧中元素的個數
s.pop() 刪除棧頂元素但不返回其值
s.top() 返回棧頂的元素,但不刪除該元素
s.push() 在棧頂壓入新元素
佇列提供了下面的操作
q.empty() 如果佇列為空返回true,否則返回false
q.size() 返回佇列中元素的個數
q.pop() 刪除佇列首元素但不返回其值
q.front() 返回隊首元素的值,但不刪除該元素
q.push() 在隊尾壓入新元素
q.back() 返回佇列尾元素的值,但不刪除該元素
定義 priority_queue 成優先順序佇列,先定義結構體如※,佇列成降序排列!
陣列整體操作
#include <string.h>
memset(a,b,sizeof(a));一般用於布林陣列的賦值,b=0,false;b=1,true
#include<iostream>
Fill(a+s,a+t,n)將a陣列中從s到t 均賦值為n
引入所有c++標準類庫
<bits/stdc++.h>
有關字串
在需要讀入不計空格的多個以空格分割的字串時,用char陣列,讀入方式
scanf("%s%s",&s1,&s2),計算長度方式strlen(s1);
c++函式實現離散化
程式碼:
#include<cstring>
hah=0;
for(i = 0;i < n;i++){
scanf("%d",&a[i]);
mc[hah++] = a[i];
}
sort(mc,mc+hah);
hah = unique(mc,mc+hah)-mc;
for(i = 0;i < n;i++) a[i] = lower_bound(mc,mc+hah,a[i])-mc+1;
關於unique 和lower_bound
函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第一個元素位置。如果所有元素都小於val,則返回last的位置
舉例如下:
一個數組number序列為:4,10,11,30,69,70,96,100.設要插入數字3,9,111.pos為要插入的位置的下標
則
pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後一個元素的下一個元素)。
所以,要記住:函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第一個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!!~
返回查詢元素的第一個可安插位置,也就是“元素值>=查詢值”的第一個元素的位置
類屬性演算法unique的作用是從輸入序列中“刪除”所有相鄰的重複元素。
該演算法刪除相鄰的重複元素,然後重新排列輸入範圍內的元素,並且返回一個迭代器(容器的長度沒變,只是元素順序改變了),表示無重複的值範圍得結束
冪指數的應用
#include<cmath>
Pow(x,y):x^y