C++学习之路 STL关联容器之mulit(可重复容器)

1.multiset

头文件include <set> std命名空间中

结构图:

此结构key就是value,value就是key,不分key和value 它们两个是一起的。

 可以有重复数据.(结构基于红黑树(对称二叉b树)自动调整结构的平衡)

函数:

1.insert(元素)

将一个元素或元素范围插入到多重集合中。 该函数有多种重载,请查阅官方文档

2.find(查找目标)

传入一个参数,参数就是key/value 进行查找,此结构查找非常快。几乎为0毫秒

3.size

返回容器中所有元素数目;

4.begin()

返回容器第一个元素的迭代器

5.end()

返回容器最后一个元素的下一个元素的迭代器

6.erase()

移除相应的元素

参数:

Where
要移除的元素的位置。

第一个
要移除的第一个元素的位置。

最后一个
要移除的刚超出最后一个元素的位置。

Key
要移除的元素的关键值。

等还有很多方法。查阅相关文档 multiset类

例子:

#include <iostream>
#include <ctime>
#include <set>
#include <algorithm>
#include <string>
#include <cstdlib>
using namespace std;
string get_a_string_target();

int main()
{
	srand(time(0));
	clock_t startTime = clock();
	cout << "how many elements: ";
	long int value;
	cin >> value;
	char buf[10];
	multiset<string>c;
	cout << "\ntest_multiset()..........\n";
	for (long i = 0; i < value; i++)
	{
		try
		{
			snprintf(buf, 10, "%d", rand());		//rand()随机数转为字符串

			c.insert(string(buf));
		}
		catch (exception & p)
		{
			cout << "i = " << i << p.what() << endl;
			abort();
		}
	}
	cout << "milli-seconds : " << (clock() - startTime) << endl;
	cout << "multiset.size() = " << c.size() << endl;	//得到元素多少
	cout << "multiset.max_size() = " << c.max_size() << endl;	//得到具体multise容器空间的大小
	string target = get_a_string_target();	//得到一个字符串
	{
		startTime = clock();
		auto pItem = find(c.begin(), c.end(), target);	//用全局的find函数来查找数据
		cout << "::find(), milli-second: " << (clock() - startTime) << endl;
		if (pItem != c.end())
		{
			cout << "found, " << *pItem << endl;
		}
		else {
			cout << "not found " << endl;
		}
	}
	startTime = clock();
	auto pItem = c.find(target);
	cout << "c.find(), milli-second: " << (clock() - startTime) << endl;
	if (pItem != c.end())
	{
		cout << "found, " << *pItem << endl;
	}
	else {
		cout << "not found " << endl;
	}
	system("pause");
	return 0;
}
string get_a_string_target()
{
	int val;
	char buf[10];
	cout << "target (0~" << RAND_MAX << ") : ";
	cin >> val;
	snprintf(buf,  10, "%d", val);
	return string(buf);
}

结果:

分析:1.上面的源代码主要是提示输入多大的容器空间,然后用insert插入一个随机数,这个随机数被处理为string类型,打印处理这个容器用了多长时间,还有容器内容的,为什么是1000000?因为他是一个可以重复的,而且set利用率比较好,另外全局find算法函数用了197毫秒找到,而其容器本身所自带的用了几乎为0毫秒的时间,所以如果容器本身就自带这种函数,就是用自带的。2.为什么循环用try catch ? 因为输入1百万的容器空间,可能会导致系统分配不足,出现错误,所以将它试图捕获这种错误.

2.multimap(key-value容器)

结构图:

从结构图来看,就是一个key键值对应一个value键值 但是key值不能重复, value 却是可以重复的.

这也是基于红黑树来的。

函数

1.insert(元素)

将一个元素或元素范围插入到多重集合中。 该函数有多种重载,请查阅官方文档

2.find(查找目标)

传入一个参数,参数就是key 进行查找,此结构查找非常快。几乎为0毫秒

3.size

返回容器中所有元素数目;

4.begin()

返回容器第一个元素的迭代器

5.end()

返回容器最后一个元素的下一个元素的迭代器

等还有很多方法,参阅资料multimap类

例:

#include <iostream>
#include <ctime>
#include <map>
#include <algorithm>
#include <string>
#include <cstdlib>
using namespace std;
long get_a_long_target();

int main()
{
	srand(time(0));
	clock_t startTime = clock();
	cout << "how many elements: ";
	long int value;
	cin >> value;
	char buf[10];
	multimap<long,string>c;	//key的类型为long 而value类型为string
	cout << "\ntest_multimap()..........\n";
	for (long i = 0; i < value; i++)
	{
		try
		{
			snprintf(buf, 10, "%d", rand());		//rand()随机数转为字符串

			c.insert(pair<long,string>(i,buf));	//使用pair来辅助map加入结构
		}
		catch (exception & p) 
		{
			cout << "i = " << i << p.what() << endl;
			abort();
		}
	}
	cout << "milli-seconds : " << (clock() - startTime) << endl;
	cout << "multiset.size() = " << c.size() << endl;	//得到元素多少
	cout << "multiset.max_size() = " << c.max_size() << endl;	//得到具体multimap容器空间的大小
	long target = get_a_long_target();	//得到一个long类型的数值
	startTime = clock();
	auto pItem = c.find(target);	//查找 key
	cout << "c.find(), milli-second: " << (clock() - startTime) << endl;
	if (pItem != c.end())
	{
		cout << "found, " << (*pItem).second << endl;	//second表示value第二个值 first表示第一个值
		cout << "found, key : " << (*pItem).first << " , value : " << (*pItem).second << endl;
	}
	else {
		cout << "not found " << endl;
	}
	system("pause");
	return 0;
}
long get_a_long_target()
{
	long val;
	cout << "target (0~" << RAND_MAX << ") : ";
	cin >> val;
	return val;
}

运行结果:

源码分析:

引入头文件#include<map>

示例中有一句用pair<long,string>(i,buf) 有引用的时候这个multimap是一个key和value的组合所以需要把key和value组合在一起,所以引用了这个,这是标准库提供的,另外一个结构叫做pair“”(一对就是两个东西(key和value))还是上一个例子一样打印开辟一百万个大小的容器所用的时间用try catch来捕获开辟过程中的错误异常,最后用c.find(key)自带的find函数来寻找key 并且返回一个迭代器(可以说算是一个指针)... 但是这个迭代器有两个属性一个是first这个第一个就是long前面定义的就是key键值,而second就是前面pair定义的string类型的value. 最后打印出来结果...

猜你喜欢

转载自blog.csdn.net/z1455841095/article/details/82700270
今日推荐