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. 最后打印出来结果...