关联容器主要有两类 set和map,都属于双向迭代器
set 集合 基于平衡二叉树(红黑树)存储,元素值唯一且有序
multiset 多重集合 基于平衡二叉树(红黑树)存储,元素值可以重复
unordered_set 无序集合 基于哈希表 无序的,但是元素值唯一,使用时需要包含头文件
以上三个功能基本一致,只是内部实现有所不同
unordered_multiset 多重无序集合
如下一个程序演示set关联容器
#include
template
void print(T Begin, T end)
{
for (T i = Begin; i != end; ++i)
{
std::cout << *i << std::endl;
}
std::cout << std::endl;
}
int main()
{
std::set
for (auto i = obj.begin(); i != obj.end(); i++) 遍历该容器
{
std::cout << *i << std::endl; 打印元素值
}
结果发现,从小到大打印,证明容器元素是有序的
std::set
元素从obj容器的开始到结尾全部拷贝
objB.erase(84); 删除该容器中84的值
objB.erase(objB.begin());删除某个迭代器指向的位置
objB.erase(objB.begin(), objB.end()); 删除某个迭代器指向的位置到另一个迭代器指向的位置
objB.insert(999); 插入999
if (objB.insert(999).second) second用来判断插入元素后,该元素在容器中个数,如果为1则返
回ture,如果为2则返回false
{
std::cout << "insert success" << std::endl;
}
else
{
std::cout << "insert failed" << std::endl;
}
if (objB.find(12) != objB.end()) 遍历查找元素,如果返回false意味着容器元素都查找了一遍,没
有找到要查找的元素,查找失败
{
std::cout << "find success" << std::endl;
}
else
{
std::cout << "find failed" << std::endl;
}
for (auto i = objB.rbegin(); i != objB.rend(); i++) 反向遍历
{
std::cout << *i << std::endl;
}
print(objB.begin(),objB.end()); 可以应用模板函数遍历
system("pause");
return 0;
}
map 映射/地图 基于平衡二叉树(红黑树)存储 key:value(用key查找value) key是唯一的,但是
value可以重复
multimap 多重映射 基于平衡二叉树(红黑树)存储 key不唯一,value不唯一,但是有序
unordered_map 无序集合 哈希表 无序,但是key唯一
unordered_multimap 多重无序映射
map和set的方法一样,区别在于map允许重复元素
如下一个程序进行展示
#include
#include
int main()
{
std::pair
std:: map
是pair的集合
obj.insert(p1); map通过插入pair进行插入元素
std::pair
p2.first = 5;
p2.second = "EEEEE";
obj.insert(p2);
std::pair
obj.insert(p3);
auto p4 = obj.find(5); p4接受返回一个迭代器,指向key = 5所在的位置
*p4的值为key = 5所在位置的pair这个结构
auto p5 = *p4;
std::cout << p5.first << "\t" << p5.second << std::endl; 打印p5结构的第一个元素和第二个元素
obj.erase(4); 删除key为4的元素
obj.erase(obj.begin()); 删除头元素
obj.erase(obj.begin(), obj.end()); 删除指定范围元素
obj.clear(); 清空
for (auto i = obj.begin(); i != obj.end(); i++) 遍历打印元素,也可反向遍历打印
{
std::cout << i->first << "\t" << i->second << std::endl;
}
system("pause");
return 0;
}