第一章-语言基础\3.STL
目录
list
示例代码
vector
示例代码
set
set
示例代码
multiset
示例代码
unordered_set(仅做了解)
map
map
示例代码
multimap
unordered_map
pair
示例代码
queue
queue
例题练习
priority_queue优先队列(重要)
例题练习
deque双端队列
stack
示例代码
list
示例代码
#include <bits/stdc++.h>
using namespace std;int main()
{//创建一个List<int>对象myList list<int> myList;//向myList尾部添加元素for (int i = 1;i <= 5;i++)myList.push_back(i); //从头到尾输出myList中的元素for (const auto &i : myList) cout << i << ' ';cout << '\n';//将myList中的元素反转reverse(myList.begin(),myList.end());for (const auto &i : myList) cout << i << ' ';cout << '\n';//在第一个元素的后一个位置加上元素0myList.insert(++myList.begin(),0);for (auto i : myList) cout << i << ' ';cout << '\n';//删除从三个元素到第六个元素这个区间(左闭右开)myList.erase(++++myList.begin(),--myList.end());//输出myList的大小cout << "链表大小为:" << myList.size() << '\n';//从头到尾输出myList中的元素for (auto i : myList) cout << i << ' ';cout << '\n';return 0;
}
vector
#include <bits/stdc++.h>
using namespace std;int main()
{vector<int> v = {2,1,3,2,4,1,5,4};sort(v.begin(),v.end());auto last = unique(v.begin(),v.end());//指向第一个重复元素的迭代器v.erase(last,v.end());for (auto num : v)cout << num << ' ';cout << '\n'; return 0;
}//输出1 2 3 4 5
示例代码
#include <bits/stdc++.h>
using namespace std;int main()
{vector<int> v;//向向量中添加元素v.push_back(5); v.push_back(2); v.push_back(8); v.push_back(1); v.push_back(2); v.push_back(8); v.push_back(9); //打印向量中的元素for (auto i : v){cout << i << ' ';} cout << '\n';//对向量进行排序sort(v.begin(),v.end());//打印排序后的向量cout << "排序后的向量" << '\n';for (auto i : v)cout << i << ' ';cout << '\n';//去除重复元素v.erase(unique(v.begin(),v.end()),v.end());//打印去重后的向量cout << "去重后的向量" << '\n';for (auto i : v){cout << i << ' ';} cout << '\n';//向向量中插入元素v.insert(v.begin()+2,3);v.insert(v.begin()+3,4);v.insert(v.begin()+4,5);//打印新的向量cout << "插入元素后的向量" << '\n';for (auto i : v){cout << i << ' ';} cout << '\n';//删除向量中某个元素v.erase(v.begin()+4);//打印删除元素后的向量cout << "删除元素后的向量" << '\n';for (auto i : v){cout << i << ' ';} cout << '\n';//检查向量是否为空if (v.empty()){cout << "向量为空" << '\n';} else{cout << "向量不为空" << '\n'; }//获取向量的大小cout << "向量的大小为:" << v.size() << '\n';//清空向量v.clear();//检查向量是否为空if (v.empty()){cout << "向量为空" << '\n';} else{cout << "向量不为空" << '\n'; }return 0;
}
set
set
示例代码
#include <bits/stdc++.h>
using namespace std;int main()
{set<int> mySet;//插入元素mySet.insert(5); mySet.insert(2); mySet.insert(8); mySet.insert(2); //重复元素//遍历集合cout << "Set elements:";for (auto elem : mySet) {cout << elem << ' ';} cout << '\n';//查找元素int target = 5;auto it = mySet.find(target);if (it != mySet.end()) {cout << target << " found in the set." << endl;} else {cout << target << " not found in the set." << endl;}//移除元素int removeValue = 2;mySet.erase(removeValue);//查看移除后的集合cout << "Set elements after removal:";for (auto elem : mySet) {cout << elem << ' ';}cout << '\n';//清除集合mySet.clear();//检查集合是否为空if (mySet.empty()) {cout << "Set is empty." << endl;} else {cout << "Set is not empty." << endl;}return 0;
}
multiset
示例代码
#include <bits/stdc++.h>
using namespace std;int main()
{multiset<int> myMultiset;//插入元素myMultiset.insert(5);myMultiset.insert(2);myMultiset.insert(8);myMultiset.insert(2); //允许重复元素//遍历多重集合cout << "Multiset elements:";for (auto elem : myMultiset) {cout << elem << ' ';} cout << '\n';//查找元素int searchValue = 5;auto it = myMultiset.find(searchValue);if (it != myMultiset.end()) {cout << searchValue << " found in the multiset." << endl;} else {cout << searchValue << " not found in the multiset." << endl;}//移除元素int removeValue = 2;myMultiset.erase(removeValue);//查看移除后的多重集合cout << "Multiset elements after removal:";for (auto elem : myMultiset) {cout << elem << ' ';} cout << '\n';// Multiset elements after removal:5 8 所有2都被移除了//只移除第一个出现的目标值myMultiset.insert(2);myMultiset.insert(2);//遍历多重集合
// cout << "Multiset elements:";
// for (auto elem : myMultiset) {
// cout << elem << ' ';
// }
// cout << '\n';myMultiset.erase(myMultiset.find(removeValue));//查看去除第一个出现目标元素后的多重集合 cout << "Multiset elements:";for (auto elem : myMultiset) {cout << elem << ' ';} cout << '\n';//Multiset elements:2 5 8 //清空多重集合myMultiset.clear();//检查多重集合是否为空if (myMultiset.empty()) {cout << "Multiset is empty." << endl;} else {cout << "Multiset is not empty." << endl;}return 0;
}
unordered_set(仅做了解)
map
map
示例代码
#include <bits/stdc++.h>
using namespace std;int main()
{//创建并初始化mapmap<int,string> myMap = {{1,"Apple"},{2,"Banana"},{3,"Orange"}};//插入元素 insertmyMap.insert({4,"Grapes"}); //或者使用make_pair(4,"Grapes")创建键值对//查找和访问元素 通过键去查找值 cout << "Value at key 2:" << myMap[2] << endl; //遍历并打印map中的元素for (auto t : myMap) {cout << "Key:" << t.first << ",Value:" << t.second << endl;} //删除元素myMap.erase(3);//判断元素是否存在 if (myMap.count(3) == 0) {cout << "Key 3 not found." << endl;} //清空mapmyMap.clear();//判断map是否为空 if (myMap.size() == 0) { //或者用myMap.empty()来判断 cout << "Map is empty" << endl;} return 0;
}
multimap
unordered_map
pair
示例代码
#include <bits/stdc++.h>
using namespace std;//定义一个结构体,用来表示个人信息
struct Person {string name;int age;
};int main() {//创建一个存储Person对象的向量vector<Person> people;//添加一些Person对象到向量中去people.push_back({"Alice",25});people.push_back({"Bob",30});people.push_back({"Charlie",20});//创建一个存储pair的向量,每个pair包含一个Person和一个评分vector<pair<Person,int>> scores;//添加一些pair到向量中scores.push_back({people[0],90}); scores.push_back({people[1],85}); scores.push_back({people[0],90}); for (const auto& t : scores) { //const表示不会对数据进行修改 &表示引用类型 cout << "Name:" << t.first.name << endl;cout << "Age :" << t.first.age << endl;cout << "Score:" << t.second << endl;cout << endl;}return 0;
}
queue
queue
例题练习
0CLZ银行问题 - 蓝桥云课
#include <bits/stdc++.h>
using namespace std;int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin >> n;queue<string> V,N;while (n--) {string op;cin >> op;if (op == "IN") {string name,q;cin >> name >> q;if (q == "V") {V.push(name);}else {N.push(name);}}else {string q;cin >> q;if (q == "V") V.pop();else N.pop();}}while (V.size()) {cout << V.front() << endl;V.pop();}while (N.size()) {cout << N.front() << endl;N.pop();}return 0;
}
priority_queue优先队列(重要)
例题练习
0合并果子 - 蓝桥云课
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;int n;
priority_queue<ll,vector<ll>,greater<ll>> pq;int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> n;for (int i = 1;i <= n;i++) {ll x;cin >> x;pq.push(x);}ll ans = 0;while (pq.size() >= 2) {ll x = pq.top();pq.pop();ll y = pq.top();pq.pop();ans += x + y;pq.push(x+y);}cout << ans << endl;return 0;
}
deque双端队列
stack
示例代码
#include <bits/stdc++.h>
using namespace std;int main() {stack<int> myStack;//向栈中插入元素myStack.push(10);myStack.push(20);myStack.push(30);myStack.push(40);//获取栈顶元素cout << "栈顶元素:" << myStack.top() << endl;//弹出栈顶元素myStack.pop();//再次获取栈顶元素cout << "栈顶元素:" << myStack.top() << endl;//检查栈是否为空if (myStack.empty()) {cout << "栈为空" << endl;} else {cout << "栈不为空" << endl;}//获取栈的大小cout << "栈的大小:" << myStack.size() << endl;return 0;
}