set与map的特性及区别
在STL中实现了树形结构(红黑树)和哈希结构(哈希桶)两种管理式结构。其中树形结构主要有set、map、multiset、multimap四种。
set
set用于存储一个键值(key),支持高效的关键字查询,同时具有排序和去重的特性。
int main()
{
set<int> test;
test.insert(7);
test.insert(7);
test.insert(7);
test.insert(11);
test.insert(4);
test.insert(1);
test.insert(6);
test.insert(10);
for (auto x : test)
{
cout << x << " ";
}
cout << endl;
return 0;
}
set常用接口的使用
注:查找接口find,如果找得到则返回一个指向查找的key的迭代器,找不到则返回 end() 。
int main()
{
set<int> test;
//insert插入
test.insert(7);
test.insert(7);
test.insert(7);
test.insert(11);
test.insert(4);
test.insert(1);
test.insert(6);
test.insert(10);
//范围for遍历,本质上就是迭代器遍历
for (auto x : test)
{
cout << x << " ";
}
cout << endl;
//查找
if (test.find(7) != test.end())
cout << "找到了" << endl;
//删除
test.erase(6);
test.erase(1);
cout << "删除1、6后: ";
for (auto x : test)
{
cout << x << " ";
}
cout << endl;
//清空
test.clear();
cout << "清空后: ";
for (auto x : test)
{
cout << x << " ";
}
cout << endl;
return 0;
}
multiset与set的使用方法完全一致,唯一区别是multiset不会去重。如图,依旧保留了多个7。
map
map用于存储 <键值(key),数值(value)> 这样一对数值,通过关键字与数值建立映射关系,可以通过关键字去寻找到对应的数值,会根据键值来进行排序和去重操作。键值是唯一的不可修改,数值不是唯一的。
map常用接口的使用
在这里以<水果,个数>为例简单介绍一下map的接口。
插入时要注意,因为存储的是pair<string,int>,所以有这样三种插入方式:
- test.insert(pair<string,int>("西瓜", 9));
- test.insert(make_pair("西瓜", 8));
- test.insert({ "西瓜",7 });
int main()
{
map<string,int> test;
//insert插入
test.insert(pair<string,int>("西瓜", 9));
test.insert(make_pair("西瓜", 8));
test.insert({ "西瓜",7 });
test.insert({ "草莓",1 });
test.insert({ "芒果",2 });
test.insert({ "苹果",3 });
//范围for遍历,本质上就是迭代器遍历
for (auto x : test)
{
cout << x.first << " " << x.second << endl;
}
cout << endl;
//查找
if (test.find("西瓜") != test.end())
cout << "找到了个数是"<<test["西瓜"] << endl;
//删除
test.erase("西瓜");
test.erase("草莓");
cout << "删除西瓜、草莓后: ";
for (auto x : test)
{
cout << x.first << " " << x.second << endl;
}
cout << endl;
//清空
test.clear();
cout << "清空后: ";
for (auto x : test)
{
cout << x.first << " " << x.second << endl;
}
cout << endl;
return 0;
}
map的重载运算符[ ]
可以直接通过 变量名[key] 去访问其对应数值,如果不存在则会进行插入操作。
int main()
{
map<string,int> test;
//insert插入
test.insert(pair<string,int>("西瓜", 9));
test.insert(make_pair("西瓜", 8));
test.insert({ "西瓜",7 });
test.insert({ "草莓",1 });
test.insert({ "芒果",2 });
test.insert({ "苹果",3 });
test["西瓜"]++;
test["草莓"] = 16;
//找不到榴莲,则进行插入。
test["榴莲"];
//范围for遍历,本质上就是迭代器遍历
for (auto x : test)
{
cout << x.first << " " << x.second << endl;
}
cout << endl;
return 0;
}
同理multimap与map的使用方法也完全一致,区别还是multiset不会根据key去重。