C++資料結構彙總
阿新 • • 發佈:2019-01-28
1.vector
1.1簡介
vector可以看成是一種可以存放各種型別物件的容器,簡單地說,vector是一個能夠存放任意型別的動態陣列。
1.2注意事項
(1)如果你要表示的向量長度較長(需要為向量內部儲存很多數),容易導致記憶體洩漏,而且效率會很低;
(2)Vector作為函式的引數或者返回值時,需要注意它的寫法。
1.3使用
2.queue#include<vector> #include<iostream> #include<algorithm> using namespace std; int main() { //建立vector cout << "**********賦值**********" << endl; vector<int> v1;//不帶初始 cout << boolalpha << v1.empty() << endl;//判斷是否為空 cout << v1.size() << endl;//結果為0 vector<int> v2(3, 0);//初始3個值,都為0 for (vector<int>::iterator iter = v2.begin(); iter != v2.end(); iter++) { cout << *iter<<" "; } cout << endl; //檢視vector佔用空間 cout << "********佔用空間********" << endl; /* 注意 1.size是當前vector容器真實佔用的大小,也就是容器當前擁有多少個容器。 2.capacity是指在發生realloc前能允許的最大元素數,即預分配的記憶體空間。 3.這兩個屬性分別對應兩個方法:resize()和reserve()。 4.使用reserve()僅僅只是修改了capacity的值,容器內的物件並沒有真實的記憶體空間(空間是"野"的)。 5.此時切記使用[]操作符訪問容器內的物件,很可能出現數組越界的問題。 */ vector<int> v3; cout << "v.size() == " << v3.size() << " v.capacity() = " << v3.capacity() << endl;//0,0:初始化,容器沒有物件,也沒有預留記憶體空間 v3.reserve(10); cout << "v.size() == " << v3.size() << " v.capacity() = " << v3.capacity() << endl;//0,10:預留10個物件的空間,但是容器內並沒有物件,直接[]訪問會造成越界錯誤 v3.resize(10); v3.push_back(0); cout << "v.size() == " << v3.size() << " v.capacity() = " << v3.capacity() << endl;//11,15:size=capacity後,在push一個物件,要重新分配一部分記憶體空間,至於重新分配多少,不同庫有不同實現,這裡增加了原先大小的一半 //插入元素 cout << "********插入元素********" << endl; vector<int> v4; v4.push_back(1);//尾部插入 for (vector<int>::iterator iter = v4.begin(); iter != v4.end(); iter++) { cout << *iter << " "; } cout << endl; v4.insert(v4.begin(), 0);//指定位置插入 v4.insert(v4.begin(), 4, 3);//指定位置插入4個3 for (vector<int>::iterator iter = v4.begin(); iter != v4.end(); iter++) { cout << *iter << " "; } cout << endl; v4.insert(v4.end(),v4.begin(), v4.end());;//連線兩個v4 for (vector<int>::iterator iter = v4.begin(); iter != v4.end(); iter++) { cout << *iter << " "; } cout << endl; //刪除元素 cout << "********刪除元素********" << endl; v4.erase(v4.begin());//刪除指定位置元素 v4.erase(v4.begin(), v4.end());//指定刪除區間 cout << v4.size() << endl; v4.clear();//清空 //訪問 cout << "********訪問元素********" << endl; vector<int> v5; v5.push_back(0); cout << v5[0] << endl;//A cout << v5.at(0) << endl;//B // 如果v5非空,A行和B行沒有任何區別。如果v為空,B行會丟擲std::out_of_range異常,A行的行為未定義。如果需要進行下標檢查,使用at //assign分配 cout << "******驗證assign******" << endl; vector<int> v6(4, 0); vector<int> v7; v7.assign(3, 4);//指定分配 for (vector<int>::iterator iter = v7.begin(); iter != v7.end(); iter++) { cout << *iter << " "; } cout << endl; v7.assign(v6.begin(), v6.end());//用另一個vector進行分配 for (vector<int>::iterator iter = v7.begin(); iter != v7.end(); iter++) { cout << *iter <<" "; } cout << endl; //演算法 vector<int> v8; v8.push_back(1); v8.push_back(5); v8.push_back(4); v8.push_back(2); v8.push_back(3); for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++) { cout << *iter << " "; } cout << endl; reverse(v8.begin(), v8.end());//逆序,需要#include<algorithm> for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++) { cout << *iter << " "; } cout << endl; sort(v8.begin(), v8.end()); //升序 for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++) { cout << *iter << " "; } cout << endl; //定義排序比較函式,可進行降序排序 bool comp(const int &a, const int &b); sort(v8.begin(), v8.end(),comp); //降序 for (vector<int>::iterator iter = v8.begin(); iter != v8.end(); iter++) { cout << *iter << " "; } cout << endl; //二維陣列 cout << "********二維陣列********" << endl; vector<vector<int>> v9; vector<int> v9_0(3, 4); vector<int> v9_1(3, 6); v9.push_back(v9_0); v9.push_back(v9_1); for (int i = 0; i < v9.size();i++) { for (int j = 0; j < v9[0].size();j++) cout << v9[i][j]<< " "; cout << endl; } cout << endl; system("pause"); } bool comp(const int &a, const int &b) { return a > b; }
2.1簡介
queue 模板類需要兩個模板引數,一個是元素型別,一個容器型別,元素型別是必要的,容器型別是可選的,預設為deque 型別。
2.2基本操作
入隊,如例:q.push(x); 將x 接到佇列的末端。
出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。
訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。
判斷佇列空,如例:q.empty(),當佇列空時,返回true。
訪問佇列中的元素個數,如例:q.size()
2.3使用
3.stack#include<queue> #include<iostream> using namespace std; int main() { int e; queue < int > q1; for (int i = 0; i<10; i++) q1.push(i); for (int i = 0; i < q1.size(); i++) { e = q1.front();//取第一個元素 cout << e << " "; q1.pop();//沒有返回值 q1.push(e);//再從後面加進去 } cout << endl; cout <<"queue empty?"<< boolalpha<<q1.empty()<<endl; cout << "queue size:"<<q1.size() << endl; cout << "queue front:" << q1.front() << endl; cout << "queue back:" << q1.back() << endl; system("pause"); }
3.1簡介
先進後出
3.2基本操作
empty() 堆疊為空則返回真
pop() 移除棧頂元素(不會返回棧頂元素的值)
push() 在棧頂增加元素
size() 返回棧中元素數目
top() 返回棧頂元素
3.3使用
#include <iostream> # include <stack> using namespace std; void reverseStack(stack <int> &s); void printStack(stack<int> &st); void main() { stack<int> st; // 產生一個堆疊st,由下至上的元素分別為0,1,2,3,4, cout << "入棧:"; for (int i = 0; i <5; i++) { st.push(i); cout << i << " "; } cout << endl; //反轉 // 依次彈出堆疊中的元素並顯示,分別為4,3,2,1,0 cout << "出棧:"; printStack(st); cout << "入棧:"; for (int i = 0; i <5; i++) { st.push(i); cout << i << " "; } cout << endl; reverseStack(st); cout << "反轉:"; printStack(st); system("pause"); } void reverseStack(stack <int> &s) { // 首先處理遞迴的的停止條件,及堆疊中只有一個元素的情況 if (s.empty()) return; else { //如果s裡面只有一個元素,就返回,否則就不返回。 //具體實現是先pop出來一個,判斷剩下的是不是空棧。 int a = s.top(); s.pop(); if (s.empty()){ s.push(a); return; } else{ s.push(a); } } // 其他情況 int temp1 = s.top(); s.pop(); reverseStack(s); int temp2 = s.top(); s.pop(); reverseStack(s); s.push(temp1); reverseStack(s); s.push(temp2); } void printStack(stack<int> &st) { while (!st.empty()) { cout << st.top() << " "; st.pop(); } cout << endl; }