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  struct pair;

STL-set和map_第1张图片

STL-set和map_第2张图片

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

2. make_pair

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

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

    pair 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,但在底层实际存放的是由构成的键值对。
  • set中插入元素时,只需要插入value即可,不需要构造键值对。
  • set中的元素不可以重复(因此可以使用set进行去重)。 

(一)set的模板参数列表

STL-set和map_第3张图片

(二)set的构造 

STL-set和map_第4张图片

(三)set的插入

pair insert (const value_type& val);

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

template 
  void insert (InputIterator first, InputIterator last);

1. 测试1

#include
#include
using namespace std;

void test1()
{
	sets;
	s.insert(1);
	s.insert(9);
	s.insert(4);
	s.insert(7);
	s.insert(3);

	set::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
#include
using namespace std;

void test1()
{
	sets;
	s.insert(1);
	s.insert(9);
	s.insert(4);
	s.insert(7);
	s.insert(3);

	pair::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
#include
using namespace std;
void print(const set& s)
{
	set::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	set 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::iterator itlow = s.lower_bound(7);//>= val值位置的iterator
	set::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;
}

STL-set和map_第5张图片

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

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

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

(二)查找find

  • 如果有多个相同的val,find返回中序第一个val
iterator find (const value_type& val) const;
#include
#include
using namespace std;
void print(const multiset& s)
{
	set::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multisets;
	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 ::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
#include
using namespace std;
void print(const multiset& s)
{
	set::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multisets;
	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 equal_range (const value_type& val) const;
  • 利用删除所有2,利用equal_range,找到一个范围,然后利用erase
#include
#include
using namespace std;
void print(const multiset& s)
{
	set::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multisets;
	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::iterator, set::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
#include
using namespace std;
void print(const multiset& s)
{
	set::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}
void test()
{
	multisets;
	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出现次数:"<

四、map

  • map是kv型数据结构

(一)map的模板参数列表

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

(二)插入insert

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

STL-set和map_第6张图片

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

 STL-set和map_第7张图片

(三)operator[]

mapped_type& operator[] (const key_type& k);//k 是要访问或插入的键值对的键
#include
#include
using namespace std;
void print(map m)
{
	map::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 dict;
	dict.insert(pair("insert", "插入"));
	dict.insert(pair("left", "左边"));

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

STL-set和map_第8张图片

(四)统计次数

1. 方式一

void test()
{
	string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
	map 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
#include
using namespace std;
void print(map m)
{
	map::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 countMap;
	for (auto& str : arr)
	{
		countMap[str]++;//因为map容器中第1个成员不能修改,第2个成员可以修改
	}
	print(countMap);
}
int main()
{
	test();
	return 0;
}

你可能感兴趣的:(STL,c++,算法,开发语言)