最全ACM常用STL
STL 中專門用於排列的函式(可以處理存在重複資料集的排列問題)
標頭檔案:#include <algorithm>
using namespace std;
呼叫: next_permutation(start, end);
注意:函式要求輸入的是一個升序排列的序列的頭指標和尾指標.
用法:
// 陣列
int a[N];
sort(a, a+N);
next_permutation(a, a+N);
// 向量
vector<int> ivec;
sort(ivec.begin(), ivec.end());
next_permutation(ivec.begin(), ivec.end());
例子:
vector<int> myVec;
// 初始化程式碼
sort(myVec.begin(),myVec.end());
do{
for (i = 0 ;i < size;i ++ ) cout << myVec[i] << " \t " ;
cout << endl;
}while (next_permutation(myVec.begin(), myVec.end()));
ACM/ICPC 競賽之STL簡介
一、關於STL
STL(Standard Template Library,標準模板庫)是C++語言標準中的重
要組成部分。STL 以模板類和模板函式的形式為程式設計師提供了各種資料結構和
演算法的精巧實現,程式設計師如果能夠充分地利用STL,可以在程式碼空間、執行時
間和編碼效率上獲得極大的好處。
STL 大致可以分為三大類:演算法(algorithm)、容器(Container)、迭代器
(iterator)。
STL 容器是一些模板類,提供了多種組織資料的常用方法,例如vector(向量,
類似於陣列)、list(列表,類似於連結串列)、deque(雙向佇列)、set(集合)、
map(映象)、stack(棧)、queue(佇列)、priority_queue(優先佇列)等,
通過模板的引數我們可以指定容器中的元素型別。
STL 演算法是一些模板函式,提供了相當多的有用演算法和操作,從簡單如
for_each(遍歷)到複雜如stable_sort(穩定排序)。
STL 迭代器是對C 中的指標的一般化,用來將演算法和容器聯絡起來。幾乎所有
的STL 演算法都是通過迭代器來存取元素序列進行工作的,而STL 中的每一個
容器也都定義了其本身所專有的迭代器,用以存取容器中的元素。有趣的是,
普通的指標也可以像迭代器一樣工作。
熟悉了STL 後,你會發現,很多功能只需要用短短的幾行就可以實現了。通過
STL,我們可以構造出優雅而且高效的程式碼,甚至比你自己手工實現的程式碼效
果還要好。
STL 的另外一個特點是,它是以原始碼方式免費提供的,程式設計師不僅可以自由地
使用這些程式碼,也可以學習其原始碼,甚至按照自己的需要去修改它。
下面是用STL 寫的題Ugly Numbers 的程式碼:
#include <iostream>
#include <queue>
using namespace std;
typedef pair<unsigned long, int> node_type;
int main(){
unsigned long result[1500];
priority_queue< node_type, vector<node_type>,
greater<node_type> > Q;
Q.push( make_pair(1, 2) );
for (int i=0; i<1500; i++){
node_type node = Q.top(); Q.pop();
switch(node.second){
case 2: Q.push( make_pair(node.first*2, 2) );
case 3: Q.push( make_pair(node.first*3, 3) );
case 5: Q.push( make_pair(node.first*5, 5) );
}
result[i] = node.first;
}
int n;
cin >> n;
while (n>0){
cout << result[n-1] << endl;
cin >> n;
}
return 0;
}
在ACM 競賽中,熟練掌握和運用STL 對快速編寫實現程式碼會有極大的幫助。
二、使用STL
在C++標準中,STL 被組織為以下的一組標頭檔案(注意,是沒有.h 字尾的!):
algorithm / deque / functional / iterator / list / map
memory / numeric / queue / set / stack / utility / vector
當我們需要使用STL 的某個功能時,需要嵌入相應的標頭檔案。但要注意的是,
在C++標準中,STL 是被定義在std 名稱空間中的。如下例所示:
#include <stack>
int main(){
std::stack<int> s;
s.push(0);
...
return 0;
}
如果希望在程式中直接引用STL,也可以在嵌入標頭檔案後,用using
namespace 語句將std 名稱空間匯入。如下例所示:
#include <stack>
using namespace std;
int main(){
stack<int> s;
s.push(0);
...
return 1;
}
STL 是C++語言機制運用的一個典範,通過學習STL 可以更深刻地理解C++
語言的思想和方法。在本系列的文章中不打算對STL 做深入的剖析,而只是想
介紹一些STL 的基本應用。
有興趣的同學,建議可以在有了一些STL 的使用經驗後,認真閱讀一下《C++
STL》這本書(電力出版社有該書的中文版)。
ACM/ICPC 競賽之STL--pair
STL 的<utility>標頭檔案中描述了一個看上去非常簡單的模板類pair,用來
表示一個二元組或元素對,並提供了按照字典序對元素對進行大小比較的比較
運算子模板函式。
例如,想要定義一個物件表示一個平面座標點,則可以:
pair<double, double> p1;
cin >> p1.first >> p1.second;
pair 模板類需要兩個引數:首元素的資料型別和尾元素的資料型別。pair 模
板類物件有兩個成員:first 和second,分別表示首元素和尾元素。
在<utility>中已經定義了pair 上的六個比較運算子:<、>、<=、>=、==、!=,
其規則是先比較first,first 相等時再比較second,這符合大多數應用的
邏輯。當然,也可以通過過載這幾個運算子來重新指定自己的比較邏輯。
除了直接定義一個pair 物件外,如果需要即時生成一個pair 物件,也可以
呼叫在<utility>中定義的一個模板函式:make_pair。make_pair 需要兩
個引數,分別為元素對的首元素和尾元素。
在題1067--Ugly Numbers 中,就可以用pair 來表示推演樹上的結點,用
first 表示結點的值,用second 表示結點是由父結點乘以哪一個因子得到的。
#include <iostream>
#include <queue>
using namespace std;
typedef pair<unsigned long, int> node_type;
int main(){
unsigned long result[1500];
priority_queue< node_type, vector<node_type>,
greater<node_type> > Q;
Q.push( make_pair(1, 2) );
for (int i=0; i<1500; i++){
node_type node = Q.top(); Q.pop();
switch(node.second){
case 2: Q.push( make_pair(node.first*2, 2) );
case 3: Q.push( make_pair(node.first*3, 3) );
case 5: Q.push( make_pair(node.first*5, 5) );
}
result[i] = node.first;
}
int n;
cin >> n;
while (n>0){
cout << result[n-1] << endl;
cin >> n;
}
return 0;
}
<utility>看上去是很簡單的一個頭檔案,但是<utility>的設計中卻濃縮
反映了STL 設計的基本思想。有意深入瞭解和研究STL 的同學,仔細閱讀和
體會這個簡單的標頭檔案,不失為一種入門的途徑。
ACM/ICPC 競賽之STL--vector
在STL 的<vector>標頭檔案中定義了vector(向量容器模板類),vector
容器以連續陣列的方式儲存元素序列,可以將vector 看作是以順序結構實現
的線性表。當我們在程式中需要使用動態陣列時,vector 將會是理想的選擇,
vector 可以在使用過程中動態地增長儲存空間。
vector 模板類需要兩個模板引數,第一個引數是儲存元素的資料型別,第二
個引數是儲存分配器的型別,其中第二個引數是可選的,如果不給出第二個參
數,將使用預設的分配器。
下面給出幾個常用的定義vector 向量物件的方法示例:
vector<int> s;
定義一個空的vector 物件,儲存的是int 型別的元素。
vector<int> s(n);
定義一個含有n 個int 元素的vector 物件。
vector<int> s(first, last);
定義一個vector 物件,並從由迭代器first 和last 定義的序列[first,
last)中複製初值。
vector 的基本操作有:
s[i]
直接以下標方式訪問容器中的元素。
s.front()
返回首元素。
s.back()
返回尾元素。
s.push_back(x)
向表尾插入元素x。
s.size()
返回表長。
s.empty()
當表空時,返回真,否則返回假。
s.pop_back()
刪除表尾元素。
s.begin()
返回指向首元素的隨機存取迭代器。
s.end()
返回指向尾元素的下一個位置的隨機存取迭代器。
s.insert(it, x)
向迭代器it 指向的元素前插入新元素val。
s.insert(it, n, x)
向迭代器it 指向的元素前插入n 個x。
s.insert(it, first, last)
將由迭代器first 和last 所指定的序列[first, last)插入到迭代器it
指向的元素前面。
s.erase(it)
刪除由迭代器it 所指向的元素。
s.erase(first, last)
刪除由迭代器first 和last 所指定的序列[first, last)。
s.reserve(n)
預分配緩衝空間,使儲存空間至少可容納n 個元素。
s.resize(n)
改變序列的長度,超出的元素將會被刪除,如果序列需要擴充套件(原空間小於n),
元素預設值將填滿擴展出的空間。
s.resize(n, val)
改變序列的長度,超出的元素將會被刪除,如果序列需要擴充套件(原空間小於n),
將用val 填滿擴展出的空間。
s.clear()
刪除容器中的所有的元素。
s.swap(v)
將s 與另一個vector 物件v 進行交換。
s.assign(first, last)
將序列替換成由迭代器first 和last 所指定的序列[first, last)。
[first, last)不能是原序列中的一部分。
要注意的是,resize 操作和clear 操作都是對錶的有效元素進行的操作,但
並不一定會改變緩衝空間的大小。
另外,vector 還有其他一些操作如反轉、取反等,不再一下列舉。
vector 上還定義了序列之間的比較操作運算子(>, <, >=, <=, ==, !=),
可以按照字典序比較兩個序列。
還是來看一些示例程式碼。輸入個數不定的一組整數,再將這組整數按倒序輸出,
如下所示:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> L;
int x;
while (cin>>x) L.push_back(x);
for (int i=L.size()-1; i>=0; i--) cout << L[i] << " ";
cout << endl;
return 0;
}
ACM/ICPC 競賽之STL--iterator 簡介
iterator(迭代器)是用於訪問容器中元素的指示器,從這個意義上說,
iterator(迭代器)相當於資料結構中所說的“遍歷指標”,也可以把
iterator(迭代器)看作是一種泛化的指標。
STL 中關於iterator(迭代器)的實現是相當複雜的,這裡我們暫時不去詳細
討論關於iterator(迭代器)的實現和使用,而只對iterator(迭代器)做一
點簡單的介紹。
簡單地說,STL 中有以下幾類iterator(迭代器):
輸入iterator(迭代器),在容器的連續區間內向前移動,可以讀取容器內任
意值;
輸出iterator(迭代器),把值寫進它所指向的容器中;
前向iterator(迭代器),讀取佇列中的值,並可以向前移動到下一位置
(++p,p++);
雙向iterator(迭代器),讀取佇列中的值,並可以向前向後遍歷容器;
隨機訪問iterator(迭代器), 可以直接以下標方式對容器進行訪問,
vector 的iterator(迭代器)就是這種iterator(迭代器);
流iterator(迭代器),可以直接輸出、輸入流中的值;
每種STL 容器都有自己的iterator(迭代器)子類,下面先來看一段簡單的示
例程式碼:
#include <iostream>
#include <vector>
using namespace std;
main()
{
vector<int> s;
for (int i=0; i<10; i++) s.push_back(i);
for (vector<int>::iterator it=s.begin(); it!=s.end();
it++)
cout << *it << " ";
cout << endl;
return 1;
}
vector 的begin()和end()方法都會返回一個vector::iterator 物件,
分別指向vector 的首元素位置和尾元素的下一個位置(我們可以稱之為結束
標誌位置)。
對一個iterator(迭代器)物件的使用與一個指標變數的使用極為相似,或者
可以這樣說,指標就是一個非常標準的iterator(迭代器)。
再來看一段稍微特別一點的程式碼:
#include <iostream>
#include <vector>
using namespace std;
main()
{
vector<int> s;
s.push_back(1);
s.push_back(2);
s.push_back(3);
copy(s.begin(), s.end(), ostream_iterator<int>(cout, "
"));
cout <<endl;
return 1;
}
這段程式碼中的copy 就是STL 中定義的一個模板函式,copy(s.begin(),
s.end(), ostream_iterator<int>(cout, " "));的意思是將由
s.begin()至s.end()(不含s.end())所指定的序列複製到標準輸出流
cout 中,用" "作為每個元素的間隔。也就是說,這句話的作用其實就是將表
中的所有內容依次輸出。
iterator(迭代器)是STL 容器和演算法之間的“膠合劑”,幾乎所有的STL 算
法都是通過容器的iterator(迭代器)來訪問容器內容的。只有通過有效地運
用iterator(迭代器),才能夠有效地運用STL 強大的演算法功能。
ACM/ICPC 競賽之STL--string
字串是程式中經常要表達和處理的資料,我們通常是採用字元陣列或字元指
針來表示字串。STL 為我們提供了另一種使用起來更為便捷的字串的表達
方式:string。string 類的定義在標頭檔案<string>中。
string 類其實可以看作是一個字元的vector,vector 上的各種操作都可以
適用於string,另外,string 類物件還支援字串的拼合、轉換等操作。
下面先來看一個簡單的例子:
#include <iostream>
#include <string>
using namespace std;
int main(){
string s = "Hello! ", name;
cin >> name;
s += name;
s += '!';
cout << s << endl;
return 0;
}
再以題1064--Parencoding 為例,看一段用string 作為容器,實現由P
程式碼還原括號字串的示例程式碼片段:
int m;
cin >> m; // P 編碼的長度
string str; // 用來存放還原出來的括號字串
int leftpa = 0; // 記錄已出現的左括號的總數
for (int j=0; j<m; j++){
int p;
cin >> p;
for (int k=0; k<p-leftpa; k++) str += '(';
str += ')';
leftpa = p;
}
ACM/ICPC 競賽之STL--stack/queue
stack(棧)和queue(佇列)也是在程式設計中經常會用到的資料容器,STL
為我們提供了方便的stack(棧)的queue(佇列)的實現。
準確地說,STL 中的stack 和queue 不同於vector、list 等容器,而是對
這些容器的重新包裝。這裡我們不去深入討論STL 的stack 和queue 的實現
細節,而是來了解一些他們的基本使用。
1、stack
stack 模板類的定義在<stack>標頭檔案中。
stack 模板類需要兩個模板引數,一個是元素型別,一個容器型別,但只有元
素型別是必要的,在不指定容器型別時,預設的容器型別為deque。
定義stack 物件的示例程式碼如下:
stack<int> s1;
stack<string> s2;
stack 的基本操作有:
入棧,如例:s.push(x);
出棧,如例:s.pop();注意,出棧操作只是刪除棧頂元素,並不返回該元素。
訪問棧頂,如例:s.top()
判斷棧空,如例:s.empty(),當棧空時,返回true。
訪問棧中的元素個數,如例:s.size()
下面是用string 和stack 寫的解題1064--Parencoding 的程式。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int main(){
int n;
cin >> n;
for (int i=0; i<n; i++){
int m;
cin >> m;
string str;
int leftpa = 0;
for (int j=0; j<m; j++) // 讀入P 編碼,構造括號字串
{
int p;
cin >> p;
for (int k=0; k<p-leftpa; k++) str += '(';
str += ')';
leftpa = p;
}
stack<int> s;
for (string::iterator it=str.begin();
it!=str.end(); it++) { // 構造M 編碼
if (*it=='(') s.push(1);
else{
int p = s.top(); s.pop();
cout << p << " ";
if (!s.empty()) s.top() += p;
}
}
cout << endl;
}
return 0;
}
2、queue
queue 模板類的定義在<queue>標頭檔案中。
與stack 模板類很相似,queue 模板類也需要兩個模板引數,一個是元素類
型,一個容器型別,元素型別是必要的,容器型別是可選的,預設為deque 類
型。
定義queue 物件的示例程式碼如下:
queue<int> q1;
queue<double> q2;
queue 的基本操作有:
入隊,如例:q.push(x); 將x 接到佇列的末端。
出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元
素的值。
訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。
判斷佇列空,如例:q.empty(),當佇列空時,返回true。
訪問佇列中的元素個數,如例:q.size()
3、priority_queue
在<queue>標頭檔案中,還定義了另一個非常有用的模板類
priority_queue(優先佇列)。優先佇列與佇列的差別在於優先佇列不是按
照入隊的順序出隊,而是按照佇列中元素的優先權順序出隊(預設為大者優先,
也可以通過指定運算元來指定自己的優先順序)。
priority_queue 模板類有三個模板引數,第一個是元素型別,第二個容器
型別,第三個是比較運算元。其中後兩個都可以省略,預設容器為vector,默
認運算元為less,即小的往前排,大的往後排(出隊時序列尾的元素出隊)。
定義priority_queue 物件的示例程式碼如下:
priority_queue<int> q1;
priority_queue< pair<int, int> > q2; // 注意在兩個尖括號之間
一定要留空格。
priority_queue<int, vector<int>, greater<int> > q3; // 定
義小的先出隊
priority_queue 的基本操作與queue 相同。
初學者在使用priority_queue 時,最困難的可能就是如何定義比較運算元了。
如果是基本資料型別,或已定義了比較運算子的類,可以直接用STL 的less
運算元和greater 運算元——預設為使用less 運算元,即小的往前排,大的先出隊。
如果要定義自己的比較運算元,方法有多種,這裡介紹其中的一種:過載比較運
算符。優先佇列試圖將兩個元素x 和y 代入比較運算子(對less 運算元,呼叫
x<y,對greater 運算元,呼叫x>y),若結果為真,則x 排在y 前面,y 將先
於x 出隊,反之,則將y 排在x 前面,x 將先出隊。
看下面這個簡單的示例:
#include <iostream>
#include <queue>
using namespace std;
class T{
public:
int x, y, z;
T(int a, int b, int c):x(a), y(b), z(c){}
};
bool operator < (const T &t1, const T &t2){
return t1.z < t2.z; // 按照z 的順序來決定t1 和t2 的順序
}
int main(){
priority_queue<T> q;
q.push(T(4,4,3));
q.push(T(2,2,5));
q.push(T(1,5,4));
q.push(T(3,3,6));
while (!q.empty()){
T t = q.top(); q.pop();
cout << t.x << " " << t.y << " " << t.z << endl;
}
return 0; }
輸出結果為(注意是按照z 的順序從大到小出隊的):
3 3 6
2 2 5
1 5 4
4 4 3
再看一個按照z 的順序從小到大出隊的例子:
#include <iostream>
#include <queue>
using namespace std;
class T{
public:
int x, y, z;
T(int a, int b, int c):x(a), y(b), z(c)
{
}
};
bool operator > (const T &t1, const T &t2){
return t1.z > t2.z;
}
int main(){
priority_queue<T, vector<T>, greater<T> > q;
q.push(T(4,4,3));
q.push(T(2,2,5));
q.push(T(1,5,4));
q.push(T(3,3,6));
while (!q.empty()){
T t = q.top(); q.pop();
cout << t.x << " " << t.y << " " << t.z << endl;
}
return 0;
}
輸出結果為:
4 4 3
1 5 4
2 2 5
3 3 6
如果我們把第一個例子中的比較運算子過載為:
bool operator < (const T &t1, const T &t2){
return t1.z > t2.z; // 按照z 的順序來決定t1 和t2 的順序
}
則第一個例子的程式會得到和第二個例子的程式相同的輸出結果。
再回顧一下用優先佇列實現的題1067--Ugly Numbers 的程式碼:
#include <iostream>
#include <queue>
using namespace std;
typedef pair<unsigned long int, int> node_type;
int main( int argc, char *argv[] ){
unsigned long int result[1500];
priority_queue< node_type, vector<node_type>,
greater<node_type> > Q;
Q.push( make_pair(1, 3) );
for (int i=0; i<1500; i++){
node_type node = Q.top();
Q.pop();
switch(node.second){
case 3: Q.push( make_pair(node.first*2, 3) );
case 2: Q.push( make_pair(node.first*3, 2) );
case 1: Q.push( make_pair(node.first*5, 1) );
}
result[i] = node.first;
}
int n;
cin >> n;
while (n>0){
cout << result[n-1] << endl;
cin >> n;
}
return 1;
}
ACM/ICPC 競賽之STL--map
在STL 的標頭檔案<map>中定義了模板類map 和multimap,用有序二叉樹來
存貯型別為pair<const Key, T>的元素對序列。序列中的元素以const Key
部分作為標識,map 中所有元素的Key 值都必須是唯一的,multimap 則允許
有重複的Key 值。
可以將map 看作是由Key 標識元素的元素集合,這類容器也被稱為“關聯容
器”,可以通過一個Key 值來快速確定一個元素,因此非常適合於需要按照Key
值查詢元素的容器。
map 模板類需要四個模板引數,第一個是鍵值型別,第二個是元素型別,第三
個是比較運算元,第四個是分配器型別。其中鍵值型別和元素型別是必要的。
map 的基本操作有:
1、定義map 物件,例如:
map<string, int> m;
2、向map 中插入元素對,有多種方法,例如:
m[key] = value;
[key]操作是map 很有特色的操作,如果在map 中存在鍵值為key 的元素對,
則返回該元素對的值域部分,否則將會建立一個鍵值為key 的元素對,值域為
預設值。所以可以用該操作向map 中插入元素對或修改已經存在的元素對的值
域部分。
m.insert( make_pair(key, value) );
也可以直接呼叫insert 方法插入元素對,insert 操作會返回一個pair,當
map 中沒有與key 相匹配的鍵值時,其first 是指向插入元素對的迭代器,
其second 為true;若map 中已經存在與key 相等的鍵值時,其first 是
指向該元素對的迭代器,second 為false。
3、查詢元素對,例如:
int i = m[key];
要注意的是,當與該鍵值相匹配的元素對不存在時,會建立鍵值為key 的元素
對。
map<string, int>::iterator it = m.find(key);
如果map 中存在與key 相匹配的鍵值時,find 操作將返回指向該元素對的迭
代器,否則,返回的迭代器等於map 的end()(參見vector 中提到的begin
和end 操作)。
4、刪除元素對,例如:
m.erase(key);
刪除與指定key 鍵值相匹配的元素對,並返回被刪除的元素的個數。
m.erase(it);
刪除由迭代器it 所指定的元素對,並返回指向下一個元素對的迭代器。
看一段簡單的示例程式碼:
#include<map>
#include<iostream>
using namespace std;
typedef map<int, string, less<int> > M_TYPE;
typedef M_TYPE::iterator M_IT;
typedef M_TYPE::const_iterator M_CIT;
int main(){
M_TYPE MyTestMap;
MyTestMap[3] = "No.3";
MyTestMap[5] = "No.5";
MyTestMap[1] = "No.1";
MyTestMap[2] = "No.2";
MyTestMap[4] = "No.4";
M_IT it_stop = MyTestMap.find(2);
cout << "MyTestMap[2] = " << it_stop->second << endl;
it_stop->second = "No.2 After modification";
cout << "MyTestMap[2] = " << it_stop->second << endl;
cout << "Map contents : " << endl;
for(M_CIT it = MyTestMap.begin(); it != MyTestMap.end();
it++){
cout << it->second << endl;
}
return 0;
}
程式執行的輸出結果為:
MyTestMap[2] = No.2
MyTestMap[2] = No.2 After modification
Map contents :
No.1
No.2 After modification
No.3
No.4
No.5
再看一段簡單的示例程式碼:
#include <iostream>
#include <map>
using namespace std;
int main(){
map<string, int> m;
m["one"] = 1;
m["two"] = 2;
// 幾種不同的insert 呼叫方法
m.insert(make_pair("three", 3));
m.insert(map<string, int>::value_type("four", 4));
m.insert(pair<string, int>("five", 5));
string key;
while (cin>>key){
map<string, int>::iterator it = m.find(key);
if (it==m.end()){
cout << "No such key!" << endl;
}
else{
cout << key << " is " << it->second << endl;
cout << "Erased " << m.erase(key) << endl;
}
}
return 0;
}
ACM/ICPC 競賽之STL--algorithm
<algorithm>無疑是STL 中最大的一個頭檔案,它是由一大堆模板函式組成
的。
下面列舉出<algorithm>中的模板函式:
adjacent_find / binary_search / copy / copy_backward / count
/ count_if / equal / equal_range / fill / fill_n / find /
find_end / find_first_of / find_if / for_each / generate /
generate_n / includes / inplace_merge / iter_swap /
lexicographical_compare / lower_bound / make_heap / max /
max_element / merge / min / min_element / mismatch /
next_permutation / nth_element / partial_sort /
partial_sort_copy / partition / pop_heap / prev_permutation
/ push_heap / random_shuffle / remove / remove_copy /
remove_copy_if / remove_if / replace / replace_copy /
replace_copy_if / replace_if / reverse / reverse_copy /
STL 中專門用於排列的函式(可以處理存在重複資料集的排列問題)
標頭檔案:#include <algorithm>
using namespace std;
呼叫: next_per 反斜杠 -1 正則表達 所有 2個 嵌套 pan span 至少 轉載:http://www.cnblogs.com/zxin/archive/2013/01/26/2877765.html
一、校驗數字的表達式
1 數字:^[0-9]*$
2 n位的數字:^\d{n 沒有 反斜杠 字母數 刪除 備註 ip地址 漢字 str 長度 一、校驗數字的表達式
1 數字:^[0-9]*$
2 n位的數字:^\d{n}$
3 至少n位的數字:^\d{n,}$
4 m-n位的數字:^\d{m,n}$
5 零和非零開頭的數字:^(0| 需求 至少 xxxxx 0.00 下劃線 最全的 電話 使用 字符串 一、校驗數字的表達式
1 數字:^[0-9]*$
2 n位的數字:^\d{n}$
3 至少n位的數字:^\d{n,}$
4 m-n位的數字:^\d{m,n}$
5 零和非零開頭的數字:^(0|[1- slow alc 刪除行 數字 常用正則表達式 所有 else ref 只能輸入數字 轉自:http://www.open-open.com/code/view/1430625516632
一、校驗數字的表達式
1 數字:^[0-9]*$
2 n位的數字:^\d{ 取ip 使用 版本 我們 http 大全 劃線 刪除 一個 最全的常用正則表達式大全
開發中常用的一些正則表達式整理了一下,包括校驗數字、字符、一些特殊的需求等等
一、校驗數字的表達式
數字:^[0-9]$n位的數字:^d{n}$至少n位的數字:^d{n,}$m-n位的數字
我們在開發的時候,會看到各種的註解,如果不細細研究下,傻傻的分不清楚,更談不上怎麼合理的利用了,接下來我們一起看下。 研究順序,從最常用的來,follow me
[email protected]註解 用於標註控制層元件(如struts中的action)。如果@Controller不指
容器
注://符號表示不常用。
· stringstream name(st) (sstream) 神一般的操作
將字串st轉化為輸入流,可以用來name>>str.
· vector<int>name(n,v)
變數name是一個vect
1、將NSData / NSString轉化
1
2
3
NSData*data
= [string dataUsingEncoding:NSUTF8StringEncoding];//
將字串轉data
NSString*
API
checkBankCard : 校驗銀行卡卡號是否合法
getBankCardCheckCode: 從不含校驗位的銀行卡卡號採用 Luhm 校驗演算法獲得校驗位
getNameOfBank : 通過銀 進制 string 常用工具類 cat i++ logs 指定位置 tput off 前言:用於處理Java基本數據的轉換及進制轉換操作工具
一、實現功能
1、int預byte互轉
2、int與byte[]互轉
3、short與byte互轉
4、short與byte[]互轉 提示 存儲 ext upload body ner board pup wan 把我認為最好的知識,拿來與他人分享,是這一生快事之一!
React Native 項目常用第三方組件匯總:
react-native-animatable 動畫
react-na 編碼 身份證 中國郵政 html 特殊 英文字母 ascii 騰訊qq url 最全面的65條最常用正則表達式
很多不太懂正則的朋友,在遇到需要用正則校驗數據時,往往是在網上去找很久,結果找來的還是不很符合要求。所以我最近把開發中常用的一些正則表達式整理了一下,在這裏分
color 設定文字的顏色,如: color:red;
font-size 設定文字的大小,如:font-size:12px; font-family 設定文字的字型,如:font-family:'微軟雅黑'; font-style 設定字型是否傾斜,如:font-style:'norm
一、校驗數字的表示式
1. 數字:^[0-9]*$
2. n位的數字:^\d{n}$
3. 至少n位的數字:^\d{n,}$
4. m-n位的數字:^\d{m,n}$
5. 零和非零開頭的數字:^(0|[1-9][0-9]*)$
6. 非零開頭的最多帶兩位小
“雲”發展得如此火熱,“雲”術語層出不窮。為了緊跟上科技潮流,做雲端計算領域的知識達人,小編整理了45個雲端計算領域常用的術語(含中英文對照)及其解釋,以供愛學習的你們參考,一起讓科技知識儲備量上升一個level~
本文內容主要包含:
•關於虛擬化
•關於雲端計算技術
•關於雲
資料夾主要建立以下資料夾:
1、Images 存放一些網站常用的圖片;
2、Css 存放一些CSS檔案;
3、Flash 存放一些Flash檔案;
4、PSD 存放一些PSD原始檔;
5、Temp 存放所有臨時圖片和其它檔案;
6、copyright
ctrl±(shift+ctrl±):移動游標到上次位置或相反,比如定位一個函式,轉到函式定義後想回到函式使用處,則用ctrl±,若又想回到函式定義處則可以按shift+ctrl±
F12:Go to Definition,到變數或函式定義的地方,如變數宣告處,
1、題記
工欲善其事必先利其器,ELK Stack的學習和實戰更是如此,特將工作中用到的“高效”工具分享給大家。
希望能借助“工具”提高開發、運維效率!
2、工具分類概覽
2.1 基礎類工具
1、Head外掛
1)功能概述:
2、Kibana工具
除了支援
轉載:http://my.oschina.net/dyyweb/blog/494504
IntelliJ Idea 常用快捷鍵 列表(實戰終極總結!!!!)
1. -----------自動程式碼--------
常用的有fori/sout/psvm+Tab即可生成迴圈、 相關推薦
最全ACM常用STL
最全的常用正則表達式大全——包括校驗數字、字符、一些特殊的需求等等
最全的常用表達式大全
(轉)最全的常用正則表達式大全——包括校驗數字、字符、一些特殊的需求等
最全的常用正則表達式(轉)
最全的常用正則表達式大全
最全Spring常用註解詳解
c++中acm常用stl和function等
ios 最全的常用字串操作
史上最全的常用開發工具類收集(持續更新中)
最全面的Java字節byte操作,處理Java基本數據的轉換及進制轉換操作工具,流媒體及java底層開發項目常用工具類
React Native常用第三方組件匯總--史上最全 之一
最全面的65條最常用正則表達式
Web:05最全-常用css列表
史上最全常用正則表示式大全
收藏 | 雲端計算領域最全常用術語(中英文對照),你知道多少個?
史上最全的HTML和CSS標籤常用命名規則
還不會vs快捷鍵的快進來,最全vs快捷鍵,非常常用,和我都是小的白的一定要看看
Elasticsearch常用最全最常用工具清單
IntelliJ Idea 常用快捷鍵最全的集合