STL-set和map

目录

一、pair和make_pair

1. pair

2. make_pair

二、set

(一)set的模板参数列表

(二)set的构造 

(三)set的插入

1. 测试1

2. 测试2

(四)low_bound和upper_bound(上/下边界)

(五)查找指定元素的范围(区间)

三、multiset

(一)介绍

(二)查找find

(三)删除erase

(四)查找特定值的范围(equal_range)

(五)计算指定值出现次数count

四、map

(一)map的模板参数列表

(二)插入insert

(三)operator[]

(四)统计次数

1. 方式一

2. 方式二


一、pair和make_pair

1. pair

template <class T1, class T2> struct pair;

  • 可以容纳两个不同类型的值。它通常用于将两个值组合在一起,使得它们可以作为一个单元来处理 

2. make_pair

  • make_pair 是一个函数模板,可以让编译器根据参数自动确定类型
template <class T1, class T2>
  pair<T1,T2> make_pair (T1 x, T2 y);
#include <iostream>
using namespace std;

int main() {
    int x = 10;
    double y = 3.14;

    pair<int, double> myPair = make_pair(x, y);

    cout << "First element: " << myPair.first << endl;//10
    cout << "Second element: " << myPair.second << endl;//3.14
    return 0;
}

二、set

  • set是key搜索模型容器,判断在不在
  • set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
  • set中插入元素时,只需要插入value即可,不需要构造键值对。
  • set中的元素不可以重复(因此可以使用set进行去重)。 

(一)set的模板参数列表

(二)set的构造 

(三)set的插入

pair<iterator,bool> insert (const value_type& val);

iterator insert (iterator position, const value_type& val);

template <class InputIterator>
  void insert (InputIterator first, InputIterator last);

1. 测试1

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

void test1()
{
	set<int>s;
	s.insert(1);
	s.insert(9);
	s.insert(4);
	s.insert(7);
	s.insert(3);

	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
int main()
{
	test1();//1 3 4 7 9
	return 0;
}

2. 测试2

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

void test1()
{
	set<int>s;
	s.insert(1);
	s.insert(9);
	s.insert(4);
	s.insert(7);
	s.insert(3);

	pair<set<int>::iterator, bool> ret = s.insert(7);
	cout << ret.second << endl;
}
int main()
{
	test1();//0,表示插入7失败了
	return 0;
}

(四)low_bound和upper_bound(上/下边界)

iterator lower_bound (const value_type& val) const;//返回大于等于val值位置的iterator
iterator upper_bound (const value_type& val) const;//返回大于val值位置的iterator
#include<iostream>
#include<set>
using namespace std;
void print(const set<int>& s)
{
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	set<int> s;
	for (int i = 0; i < 10; i++)
	{
		s.insert(i + 4);
	}
	
	print(s);//4 5 6 7 8 9 10 11 12 13

	set<int>::iterator itlow = s.lower_bound(7);//>= val值位置的iterator
	set<int>::iterator itup = s.upper_bound(11);//>  val值位置的iterator
	cout << "*itlow: " << *itlow << "     *itup: " << *itup << endl;//7  12

	s.erase(itlow, itup);
	print(s);//4 5 6 12 13
}
int main()
{
	test();
	return 0;
}

(五)查找指定元素的范围(区间)

pair<iterator,iterator> equal_range (const value_type& val) const;
  • 返回两个迭代器,表示指定元素在集合中的范围。第1个迭代器指向第1个等于指定元素的位置,第2个迭代器指向第1个大于指定元素的位置。
#include<iostream>
#include<set>
using namespace std;
void test()
{
	set<int> mySet = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

	pair<set<int>::iterator,set<int>::iterator> range = mySet.equal_range(4);

	cout << *(range.first) << endl;//4
	cout << *(range.second) << endl;//5
}
int main()
{
	test();
	return 0;
}

三、multiset

(一)介绍

template < class T,                        // multiset::key_type/value_type
           class Compare = less<T>,        // multiset::key_compare/value_compare
           class Alloc = allocator<T> >    // multiset::allocator_type
           > class multiset;
  • multiset是按照特定顺序存储元素的容器,其中元素是可以重复
  • 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除

(二)查找find

  • 如果有多个相同的val,find返回中序第一个val
iterator find (const value_type& val) const;
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multiset<int>s;
	s.insert(1);
	s.insert(6);
	s.insert(2);
	s.insert(2);
	s.insert(2);
	s.insert(8);
	s.insert(7);
	s.insert(5);
	s.insert(11);
	print(s);// 1 2 2 2 5 6 7 8 11

	multiset<int> ::iterator it = s.find(2);
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	//2 2 2 5 6 7 8 11
}
int main()
{
	test();
	return 0;
}

(三)删除erase

     void erase (iterator position);

size_type erase (const value_type& val);//删除所有等于 key 的元素,并返回删除的元素数量。

     void erase (iterator first, iterator last);
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multiset<int>s;
	s.insert(1);
	s.insert(6);
	s.insert(2);
	s.insert(2);
	s.insert(2);
	s.insert(8);
	s.insert(7);
	s.insert(5);
	s.insert(11);
	print(s);// 1 2 2 2 5 6 7 8 11

	size_t n =s.erase(2);
	print(s);//1 5 6 7 8 11
	cout << n;//3(删除2的数量为3)
}
int main()
{
	test();
	return 0;
}

(四)查找特定值的范围(equal_range)

pair<iterator,iterator> equal_range (const value_type& val) const;
  • 利用删除所有2,利用equal_range,找到一个范围,然后利用erase
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multiset<int>s;
	s.insert(1);
	s.insert(6);
	s.insert(2);
	s.insert(2);
	s.insert(2);
	s.insert(8);
	s.insert(7);
	s.insert(5);
	s.insert(11);
	print(s);// 1 2 2 2 5 6 7 8 11

	pair<set<int>::iterator, set<int>::iterator> ret = s.equal_range(2); 
	s.erase(ret.first, ret.second);
	print(s);//1 5 6 7 8 11
}
int main()
{
	test();
	return 0;
}

(五)计算指定值出现次数count

size_type count (const value_type& val) const;
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
	set<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multiset<int>s;
	s.insert(1);
	s.insert(6);
	s.insert(2);
	s.insert(2);
	s.insert(2);
	s.insert(8);
	s.insert(7);
	s.insert(5);
	s.insert(11);
	print(s);// 1 2 2 2 5 6 7 8 11

	cout << "2出现次数:"<<s.count(2) << endl;//3
}
int main()
{
	test();
	return 0;
}

四、map

  • map是kv型数据结构

(一)map的模板参数列表

template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;
  • key:键值对中key的类型
  • T: 键值对中value的类型
  • Compare:比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
  • Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
  • 空间配置器

(二)插入insert

pair<iterator,bool> insert (const value_type& val);
iterator insert (iterator position, const value_type& val);
	
template <class InputIterator>
  void insert (InputIterator first, InputIterator last);

#include<iostream>
#include<map>
using namespace std;
void print(map<string,string> m)
{
	map<string, string>::iterator it = m.begin();
	while (it != m.end())
	{
		cout << (*it).first << ": " << (*it).second << endl;
		it++;
	}
	cout << endl;
}
void test()
{
	map<string, string> dict;
	dict.insert(pair<string, string>("sort", "排序"));//插入匿名对象pair
	dict.insert(pair<string, string>("insert", "插入"));
	dict.insert(pair<string, string>("left", "左边"));
	
	dict.insert(make_pair("right", "右边")); // 自动堆导类型
	print(dict);
}
int main()
{
	test();
	return 0;
}

 

(三)operator[]

mapped_type& operator[] (const key_type& k);//k 是要访问或插入的键值对的键
#include<iostream>
#include<map>
using namespace std;
void print(map<string,string> m)
{
	map<string, string>::iterator it = m.begin();
	while (it != m.end())
	{
		//cout << (*it).first << ": " << (*it).second << endl;
		cout << it->first << ": " << it->second << endl;
		it++;
	}
	cout << endl;
}
void test()
{
	map<string, string> dict;
	dict.insert(pair<string, string>("insert", "插入"));
	dict.insert(pair<string, string>("left", "左边"));

	dict["erase"];  // 插入
	cout << dict["erase"] << endl; // 查找
	dict["erase"] = "删除"; // 修改
	cout << dict["erase"] << endl;// 查找
	dict["test"] = "测试";  // 插入键值对
	dict["left"] = "左边、剩余"; // 修改
	print(dict);
}
int main()
{
	test();
	return 0;
}

(四)统计次数

1. 方式一

void test()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;
	for (auto& str : arr)
	{
		auto ret = countMap.find(str);
		if (ret == countMap.end())
		{
			// 没有表示第一次出现,插入
			countMap.insert(make_pair(str, 1));
		}
		else
		{
			// 次数++
			ret->second++;
		}
		countMap[str]++;
	}
	print(countMap);
}

2. 方式二

#include<iostream>
#include<map>
using namespace std;
void print(map<string, int> m)
{
	map<string, int>::iterator it = m.begin();
	while (it != m.end())
	{
		//cout << (*it).first << ": " << (*it).second << endl;
		cout << it->first << ": " << it->second << endl;
		it++;
	}
	cout << endl;
}
void test()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	map<string, int> countMap;
	for (auto& str : arr)
	{
		countMap[str]++;//因为map容器中第1个成员不能修改,第2个成员可以修改
	}
	print(countMap);
}
int main()
{
	test();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值