資料結構之C++STL庫
阿新 • • 發佈:2018-11-11
使用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相同。開頭元素永遠都是擁有最高優先順序的元素。