1. 程式人生 > >刷演算法題常用C++知識

刷演算法題常用C++知識

刷演算法題常用C++知識

寫在前面

本文適合具備c語言基礎,想快速上手c++刷題的人,如有不足之處,歡迎各位評論。

1.輸入(cin)

char a,b; cin>>a>>b; cout<<a<<b<<endl;//給a,b賦值,輸出a,b的值,換行
注意:

cin讀入資料的效率略低於scanf。
cin讀取資料,以空格、tab或換行作為分隔符。
例如(輸入):m n
a與b的值就分別是m和n,m與n之間的空格被直接忽略了。
如果使用

scanf("%c%c",&a,&b);

a與b的值就分別是m和空格,中間的空格被成功讀取。

scanf("%c %c",&a,&b);

格式化輸入後,a與b的值即為m和n。

總結:

在對輸入效率沒有過高要求且資料是以空格、tab或換行作為分隔符德情況下,可以使用cin方便操作。

2.字串(string)

2.1 宣告賦值

string s1,s2;//宣告空字串s1,s2
s1="hello";//給s1賦值
s2=s1;//把s1的值賦給s2,s2的值為"hello"

2.2 字串連線

string s3=s1+s2;//將s1,s2連線的值賦給s3,s3的值為"hellohello"

2.3 字串擷取

兩種形式,substr(pos,n)和substr(pos)。

string s4=s3.substr(0,3);//s4的值為s3下標0開始往後3個字元,即"hel"
string s5=s3.substr(4);//s4的值為s3下標4開始後面所有字元,即"ohello"

2.4 比較操作符

string過載了很多操作符,對字串比較十分方便。
==,!=,<,>,<=,>=都可以用來做操作符兩端字串的比較,具體比較規則參照字串的字典序大小。

2.5 獲取長度

可以用s.length()或者s.size(),沒有區別。

s1.length();//5
s1.size();//5

3.引用(&)

這裡主要說一下引用和指標的區別。

  • 指標儲存的是一塊記憶體的地址,通過地址,可以訪問這塊記憶體;
    引用則是一個變數的別名,在建立時必須初始化。
  • 引用在初始化後不能改變,指標可以修改指向的物件
int *p=&a;//初始化指標p,指向a的地址
int &r=a;//給a取一個別名r,可以說r就是a

函式傳參:以函式swap(a,b)為例。

  1. 指標寫法
void swap(int *a,int *b)
{
	int tmp;
	tmp = *a;
	*a = *b;
	*b = tmp;
}
  1. 引用寫法
void swap(int &a,int &b)
{
	int tmp;
	tmp = a;
	a = b;
	b = tmp;
}

4.常用STL容器

C++ STL(標準模板庫)是一套功能強大的 C++ 模板類,提供了通用的模板類和函式,這些模板類和函式可以實現多種流行和常用的演算法和資料結構,如向量、連結串列、佇列、棧。

4.1 vector(動態陣列)

標頭檔案#include<vector>

//宣告一個int型的動態陣列
vector<int> vec;

//vec的大小
vec.size();

//判斷是否為空
vec.empty();

//vec的最大容量
vec.max_size();

//修改vec的大小
vec.resize();

//末尾新增元素
vec.push_back();      

//末尾刪除元素
vec.pop_back();      

//下標訪問
vec[0];

//迭代器遍歷
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
    cout << *it << endl;
    
//下標遍歷
for (unsigned i = 0; i < vec.size(); i++) {
    cout << vec[i]<< endl;
}

4.2 set(集合)

標頭檔案#include<set>
在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序。
比如先後向集合中插入4 3 3 2 2 1,最後集合中的結果為1 2 3 4。

//宣告一個int型的集合
set<int> s;

//set的大小
s.size();

//判斷是否為空
s.empty();

//set的最大容量
s.max_size();

//向集合中新增元素
insert(value);      

//在集合中刪除元素
erase(value);      

//返回集合第一個元素的地址
s.begin();

//返回集合最後一個元素的地址
s.end();

//迭代器遍歷
set<int>::iterator it;
for (it = s.begin(); it != s.end(); it++)
    cout << *it << endl;
    
//判斷指定值是否存在於集合中
if(s.find(value) == s.end())
	cout<<value<<"不在集合中"<<endl;

4.3 map(對映)

標頭檔案#include<map>
自動建立Key(關鍵字)- value(值)的對應。key 和 value可以是任意你需要的型別。

//宣告一個關鍵字為string型,值為int型的集合
map<string,int> m;

//map的大小
m.size();

//判斷是否為空
m.empty();

//向集合中新增元素
m["test"]=2;

//在集合中刪除元素
m.erase("test");      

//返回集合第一個元素的地址
m.begin();

//返回集合最後一個元素的地址
m.end();

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

//判斷指定關鍵字的資料是否存在於對映中
if(m.find(key) == m.end())
	cout<<key<<"不在對映中"<<endl;

4.4 stack(棧)

標頭檔案#include<stack>

stack<int> s;//宣告一個空棧
s.size();//棧大小
s.push();//壓棧
s.top();//訪問棧頂元素
s.pop();//移除棧頂元素

4.5 queue(佇列)

標頭檔案#include<queue>

queue<int> q;//宣告一個空佇列
q.size();//隊大小
q.push();//入隊
q.front();//訪問隊首元素
q.back();//訪問隊尾元素
q.pop();//移除隊首元素