1. 程式人生 > >C++資料結構彙總

C++資料結構彙總

1.vector
1.1簡介
vector可以看成是一種可以存放各種型別物件的容器,簡單地說,vector是一個能夠存放任意型別的動態陣列。
1.2注意事項
(1)如果你要表示的向量長度較長(需要為向量內部儲存很多數),容易導致記憶體洩漏,而且效率會很低;
(2)Vector作為函式的引數或者返回值時,需要注意它的寫法。

1.3使用

#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.queue
2.1簡介
queue 模板類需要兩個模板引數,一個是元素型別,一個容器型別,元素型別是必要的,容器型別是可選的,預設為deque 型別。
2.2基本操作
入隊,如例:q.push(x); 將x 接到佇列的末端。
出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。
訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。
判斷佇列空,如例:q.empty(),當佇列空時,返回true。
訪問佇列中的元素個數,如例:q.size()

2.3使用

#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.stack
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;
}