用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value。key代表键值,value表示与key对应的信息
在库中已经实现好的结构,SGI-STL中关于键值对的定义:
template
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair()
: first(T1())
, second(T2())
{}
pair(const T1& a, const T2& b)
: first(a)
, second(b)
{}
};
其含有两个成员对象,first对应key、second对应value
库中定义了make_pair()函数,可以方便创建pair对象,该函数模板会根据传入参数类型进行自动隐式推导,构造并返回一个的pair对象。
template
pair make_pair(T1 x, T2 y)
{
return (pair(x, y));
}
T:set中存放的元素类型,
Compare:set元素的比较方式,默认按小于来比较
Alloc:set元素空间的管理方式,使用STL提供的空间配置器管理
void testSet()
{
int a[] = { 1,2,3,4,2023,1,9,3,50 };
int size = sizeof(a) / sizeof(a[0]);
//排序+去重
set s(a, a + size);
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
s.erase(9);
s.erase(2023);
for (int i = 0; i < size; ++i)
{
if (s.find(a[i]) == s.end())//没找到返回s.end()
{
cout << a[i] << " 被删除了" << endl;
}
}
}
与set基本一样,其中区别在于:multiset容器中允许重复元素存在
void testSet()
{
int a[] = { 1,2,3,4,2023,1,9,3,50 };
int size = sizeof(a) / sizeof(a[0]);
//排序+不去重
multiset s(a, a + size);
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
}
key:键值对中key的类型
T:键值对中value的类型
Compare:比较对象,默认按照元素中的key的小于进行比较
Alloc:使用STL提供的空间配置器管理
void testMap()
{
string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
map countMap;
for (auto& str : arr)
{
map::iterator it = countMap.find(str);
if (it != countMap.end())
{
//(*it).second++;
it->second++;
}
else
{
countMap.insert(make_pair(str, 1));
}
}
//for (auto& str : arr)
//{
// // 1、str不在countMap中,插入pair(str, int()),然后在对返回次数++
// // 2、str在countMap中,返回value(次数)的引用,次数++;
// countMap[str]++;
//}
map::iterator it = countMap.begin();
while (it != countMap.end())
{
cout << it->first << ":" << it->second << endl;
++it;
}
}
multimap和map也相似,不同点:multimap中的Key是可以重复的;没有operator[],因为key可能对应多个value。