1. 程式人生 > >資料結構之C++STL庫

資料結構之C++STL庫

使用STL實現迭代器

#include<iostream>
#include<vector>
using namespace std;

void print(vector<int> v) {
	//從向量開頭順次訪問
	vector<int>::iterator it;
	for (it = v.begin(); it != v.end(); it++) {
		cout << *it;
	}
	cout << endl;
}

int main() {
	int N = 4;
	vector<int>
v; for (int i = 0; i < N; i++) { int x; cin >> x; v.push_back(x); } print(v); vector<int>::iterator it = v.begin(); *it = 3;//將3賦值給開頭元素v[0] it++;//前移一個位置 (*it)++;//v[1]的元素加1 print(v); system("pause"); return 0; }

輸入

2 0 1 4

輸出

2014
3114

二分搜尋

二分搜尋方面,STL提供了binary_search、lower_bound、upper_bound。

lower_bound是一種應用於有序資料範圍內的演算法,它可以返回一個迭代器,這個迭代器指向第一個不小於指定值value的元素。通過它,我們既可以找出第一個能夠恰當插入value的位置,又能維持指定範圍內的元素順序(有序狀態)。

相對的,upper_bound返回迭代器第一個大於指定值value的元素。

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
	int A[14] = {1,1,2,2,2,4,5,5,6,8,8,8,10,15};
	int *pos;
int idx; pos = lower_bound(A, A + 14, 3); idx = distance(A, pos); cout << "A[" << idx << "]=" << *pos << endl;//A[5]=4 pos = lower_bound(A, A + 14, 2); idx = distance(A, pos); cout << "A[" << idx << "]=" << *pos << endl;//A[2]=2 system("pause"); return 0; }

輸出

A[5]=4
A[2]=2

使用STL實現sort排序

給vector排序

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
	int n;
	vector<int> v;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		v.push_back(x);
	}

	sort(v.begin(), v.end());

	for (int i = 0; i < v.size(); i++) {
		cout << v[i] << " ";
	}
	cout << endl;

	system("pause");
	return 0;
}

輸入

5
5 3 4 1 2

輸出

1 2 3 4 5

給陣列排序

#include<iostream>
#include<algorithm>
using namespace std;

int main() {
	int n, v[5];
	for (int i = 0; i < 5; i++)
		cin >> v[i];

	sort(v, v + 5);

	for (int i = 0; i < 5; i++)
		cout << v[i] << " ";

	cout << endl;

	system("pause");
	return 0;
}

輸入

8 6 9 10 7

輸出

6 7 8 9 10

使用STL實現集合

管理元素集合的STL容器大致分為兩類:一類是有順序的集合,稱為序列式容器(如vector、list);另一類是經過排序的集合,稱為關聯式容器(如set、map、multiset、multimap)。

set集合

set是根據元素值進行排序的集合,所插入的元素在集合中唯一,不存在重複元素,插入時自動排序,重複元素丟棄

函式 功能 複雜度
size 大小 O(1)
clear 清空set O(n)
begin 返回指向set開頭的迭代器 O(1)
end 返回指向set末尾的迭代器 O(1)
insert(x) 插入元素x O(logn)
erase(x) 刪除元素x O(logn)
find(x) 如存在則返回該元素迭代器;否則返回S.end() O(logn)
#include<iostream>
#include<set>
using namespace std;

void print(set<int> S) {
	cout << S.size() << ":";
	for (set<int>::iterator it = S.begin(); it != S.end(); it++)
		cout << " " << (*it);
	cout << endl;
}

int main() {
	set<int> S;

	S.insert(8);
	S.insert(1);
	S.insert(7);
	S.insert(4);
	S.insert(8);
	S.insert(4);//自動排序,重複插入不算

	print(S);//4:1 4 7 8

	S.erase(7);//刪除7

	print(S);//3:1 4 8

	S.insert(2);//插入2

	print(S);//3:4 2 4 8

	if (S.find(10) == S.end())
		cout << "not found" << endl;

	system("pause");
	return 0;
}

輸出

4:1 4 7 8
3:1 4 8
4:1 2 4 8
not found

map集合

map<key,value>集合以鍵key與值value的組合為元素,每個元素擁有1個鍵和1個值,集合以值作為排序標準。集合中各個元素的鍵唯一,不存在重複。map可以看作是一種能使用任意型別下標的關聯式容器。

#include<iostream>
#include<map>
#include<string>
using namespace std;

void print(map<string, int> T) {
	map<string, int>::iterator it;
	cout << T.size() << endl;
	for (it = T.begin(); it != T.end(); it++) {
		pair<string, int> item = *it;
		cout << item.first << "-->" << item.second << endl;
	}
}

int main() {
	map<string, int> T;

	T["red"] = 32;
	T["blue"] = 688;
	T["yellow"] = 122;

	T["blue"] += 312;
		
	print(T);

	T.insert(make_pair("zebra", 101010));
	T.insert(make_pair("white", 0));
	T.erase("yellow");

	print(T);

	pair<string, int> target = *T.find("red");
	cout << target.first << "-->" << target.second << endl;

	system("pause");
	return 0;
}

輸出

3
blue-->1000
red-->32
yellow-->122

4
blue-->1000
red-->32
white-->0
zebra-->101010

red-->32

優先順序佇列

優先順序佇列priority_queue是一種能根據元素優先順序進行插入、引用、刪除操作的佇列。執行這些操作的介面與queue相同。開頭元素永遠都是擁有最高優先順序的元素。