第一章-语言基础\3.STL

发布于:2025-05-07 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

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';
	
	//在第一个元素的后一个位置加上元素0
	myList.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()
{
	//创建并初始化map
	map<int,string> myMap = {{1,"Apple"},{2,"Banana"},{3,"Orange"}};
	
	//插入元素 insert
	myMap.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;
	} 
	
	//清空map
	myMap.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;  
}

 


网站公告

今日签到

点亮在社区的每一天
去签到