1. 程式人生 > >C++常用小技巧個人總結(持續更新)

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);//d1--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.hc) 或cstdioc++

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進表示
其中hh1216進位制數
━━━━━━━━━━━━━━━━━━━━━━━━━━ 
由本節所學的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