【C++STL标准库】关联容器

这篇具有很好参考价值的文章主要介绍了【C++STL标准库】关联容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关联容器(双向迭代器)

这里给出set的基本使用方法:

#include <iostream>
#include <set>
  
  template <typename T>
void print(T Begin, T End);
  
  int main() {
std::set<int> obj = { 0,2,1,4,6,3 };
//集合迭代器,反向迭代器
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//拷贝构造:两种方式:1.class拷贝,2.给定范围拷贝
std::set<int> obj2(obj);
print(obj2.begin(), obj2.end());
std::set<int> obj3(obj.begin(), obj.end());
print(obj3.begin(), obj3.end());
std::cout << "----------------------------------------------------" << std::endl;
//erase方法:删除集合中的元素,可以删除指定位置的元素,也可以指定范围删除
obj2.erase(2);
print(obj2.begin(), obj2.end());
obj2.erase(obj2.begin(), obj2.end());
print(obj2.begin(), obj2.end());
std::cout << "----------------------------------------------------" << std::endl;
//insert方法:会自动排序,可以指定位置添加元素,返回值类型:pair,bool
obj.insert(5);
std::cout << typeid(obj.insert(5)).name() << std::endl;
std::cout << typeid(obj.insert(5).second).name() << std::endl;
    //如果要判断是否插入成功,我们应该这样判断:(这里因为是集合要求值唯一,集合中已经有5了,所以插入失败
if (obj.insert(5).second) {
    std::cout << "seccessful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//find方法:在集合中寻找,返回值类型:迭代器类型,如果找到了,则返回找到位置的迭代器,如果没有找到,则返回obj.end();
std::cout << typeid(obj.find(4)).name() << std::endl;
if (obj.find(4) != obj.end()) {
    std::cout << "successsful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
if (obj.find(9) != obj.end()) {
    std::cout << "successsful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
return 0;
}
  
  template<typename T>
void print(T Begin, T End)
{
T i;
for (i = Begin; i != End; i++) {
    std::cout << *i << std::endl;
}
std::cout << std::endl;
}

multiset 多重集合

基于平衡二叉树(红黑树)
多重集合允许值重复,其他和set一样
这里给出multiset的基本使用方法,实际上和set没太大的区别:

#include 
#include 
template <typename T>
void print(T Begin, T End);
int main() {
std::multiset obj = { 0,2,1,4,6,3 };
//集合迭代器,反向迭代器
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//拷贝构造:两种方式:1.class拷贝,2.给定范围拷贝
std::multiset obj2(obj);
print(obj2.begin(), obj2.end());
std::multiset obj3(obj.begin(), obj.end());
print(obj3.begin(), obj3.end());
std::cout << "----------------------------------------------------" << std::endl;
//erase方法:删除集合中的元素,可以删除指定位置的元素,也可以指定范围删除
obj2.erase(2);
print(obj2.begin(), obj2.end());
obj2.erase(obj2.begin(), obj2.end());
print(obj2.begin(), obj2.end());
std::cout << "----------------------------------------------------" << std::endl;
//insert方法:会自动排序,可以指定位置添加元素,返回值类型:pair,bool
obj.insert(5);
std::cout << typeid(obj.insert(5)).name() << std::endl;
print(obj.begin(), obj.end());
obj.insert(5);
obj.insert(6);
obj.insert(5);
obj.insert(5);
obj.insert(9);
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//find方法:在集合中寻找,返回值类型:迭代器类型,如果找到了,则返回找到位置的迭代器,如果没有找到,则返回obj.end();
std::cout << typeid(obj.find(4)).name() << std::endl;
if (obj.find(4) != obj.end()) {
    std::cout << "successsful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
if (obj.find(9) != obj.end()) {
    std::cout << "successsful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
return 0;
}
  template
void print(T Begin, T End)
{
T i;
for (i = Begin; i != End; i++) {
    std::cout << *i << std::endl;
}
std::cout << std::endl;

unordered_set

无序集合 基于哈希表
区别:不会对元素进行排序,其他基本没区别


#include <iostream>
#include <unordered_set>

  template <typename T>
void print(T Begin, T End);

  int main() {
std::unordered_set<int> obj = { 0,2,1,4,6,3 };
//集合迭代器,反向迭代器
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//拷贝构造:两种方式:1.class拷贝,2.给定范围拷贝
std::unordered_set<int> obj2(obj);
print(obj2.begin(), obj2.end());
std::unordered_set<int> obj3(obj.begin(), obj.end());
print(obj3.begin(), obj3.end());
std::cout << "----------------------------------------------------" << std::endl;
//erase方法:删除集合中的元素,可以删除指定位置的元素,也可以指定范围删除
obj2.erase(2);
print(obj2.begin(), obj2.end());
obj2.erase(obj2.begin(), obj2.end());
print(obj2.begin(), obj2.end());
std::cout << "----------------------------------------------------" << std::endl;
//insert方法:会自动排序,可以指定位置添加元素,返回值类型:pair,bool
obj.insert(5);
std::cout << typeid(obj.insert(5)).name() << std::endl;
print(obj.begin(), obj.end());
obj.insert(5);
obj.insert(6);
obj.insert(5);
obj.insert(5);
obj.insert(9);
print(obj.begin(), obj.end());
std::cout << "----------------------------------------------------" << std::endl;
//find方法:在集合中寻找,返回值类型:迭代器类型,如果找到了,则返回找到位置的迭代器,如果没有找到,则返回obj.end();
std::cout << typeid(obj.find(4)).name() << std::endl;
if (obj.find(4) != obj.end()) {
    std::cout << "successsful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
if (obj.find(9) != obj.end()) {
    std::cout << "successsful" << std::endl;
}
else {
    std::cout << "failed" << std::endl;
}
return 0;
}

  template<typename T>
void print(T Begin, T End)
{
T i;
for (i = Begin; i != End; i++) {
    std::cout << *i << std::endl;
}
std::cout << std::endl;
}

组合用法

unordered_multiset:多重无序集合
==允许元素重复,也不会自动排序

map(映射)

map 映射/地图 基于平衡二叉树(红黑树)
这里给出map的基本使用方法:

#include 
#include 
#include 
#include 
  int main() {
//定义前需要初始化,第一个为key类型,第二个为value
std::map<int, std::string> obj = { {1,"aaa"},{2,"bbb"},{3,"ccc"},{4,"ddd"} };
//map(映射表)实际上可以认为是键值对pair的一个集合
std::pair<int, std::string> a = { 5,"ddd" };
std::pair<int, std::string> b;
b.first = 6;
b.second = "eee";
//insert方法,插入值,会自动排序(根据键值key)
obj.insert(a);
obj.insert(b);
for (auto i = obj.begin(); i != obj.end(); i++)
{
    std::cout << i->first << ":" << i->second << std::endl;
}
//find方法:第一层迭代器,第二层pair
std::cout << typeid(obj.find(3)).name() << std::endl;
auto c = obj.find(3);//返回3所在的位置
auto d = *c;
std::cout << d.first << "\t" << d.second << std::endl;
//eraer方法:删除键值key为指定值的元素,返回值类型:键值key的无符号类型
std::cout << typeid(obj.erase(1)).name() << std::endl;
int e = obj.erase(1);
std::cout << d.first <<"\t" <<d.second << std::endl;
for (auto i = obj.begin(); i != obj.end(); i++)
{
    std::cout << i->first << ":" << i->second << std::endl;
}
return 0;
}
#include 
#include 
#include 
#include 
  int main() {
//定义前需要初始化,第一个为key类型,第二个为value
std::map<int, std::string> obj = { {1,"aaa"},{2,"bbb"},{3,"ccc"},{4,"ddd"} };
//map(映射表)实际上可以认为是键值对pair的一个集合
std::pair<int, std::string> a = { 5,"ddd" };
std::pair<int, std::string> b;
b.first = 6;
b.second = "eee";
//insert方法,插入值,会自动排序(根据键值key)
obj.insert(a);
obj.insert(b);
for (auto i = obj.begin(); i != obj.end(); i++)
{
    std::cout << i->first << ":" << i->second << std::endl;
}
//find方法:第一层迭代器,第二层pair
std::cout << typeid(obj.find(3)).name() << std::endl;
auto c = obj.find(3);//返回3所在的位置
auto d = *c;
std::cout << d.first << "\t" << d.second << std::endl;
//eraer方法:删除键值key为指定值的元素,返回值类型:键值key的无符号类型
std::cout << typeid(obj.erase(1)).name() << std::endl;
int e = obj.erase(1);
std::cout << d.first <<"\t" <<d.second << std::endl;
for (auto i = obj.begin(); i != obj.end(); i++)
{
    std::cout << i->first << ":" << i->second << std::endl;
}
return 0;
}

multimap

多重映射 基于平衡二叉树(红黑树)允许键值重复存在,会自动排序

unordered_map

无序映射 哈希表不会自动排序,不允许键值重复存在

组合类型unordered_multimap

允许键值重复存在,且不会自动排序

如果发现文章中有错误,还请大家指出来,我会非常虚心地学习,我们一起进步!!!文章来源地址https://www.toymoban.com/news/detail-617769.html

到了这里,关于【C++STL标准库】关联容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 22 标准模板库STL之容器适配器

    概述         提到适配器,我们的第一印象是想到设计模式中的适配器模式:将一个类的接口转化为另一个类的接口,使原本不兼容而不能合作的两个类,可以一起工作。STL中的容器适配器与此类似,是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一

    2024年02月05日
    浏览(38)
  • C++——STL标准模板库——容器详解——list

    list:双向链表。list是一种分布式存储的线性表,每个节点分为数据域和指针域,其中指针域中包含一个指向前驱节点的指针和一个指向后续节点的指针,基本模型如下: 1、双向链表:每个元素都有一个前驱和一个后继,这种结构允许在链表的任何位置实现快速的插入和删除

    2024年01月16日
    浏览(46)
  • STL标准模板库 vector容器与迭代器入门

    vector 就是一个连续的数据 C++11 std::vector a ={1,4,2,6,7}; 可以使用花括号来定义 容器的功能就是存储数据 迭代器的功能就是指向数据,并且可以实现前后移动(指针)算法和容器的接口的存在 vector功能是长度可变的数组, 身在栈上 里面的数据存储在堆上 因为栈不可动态扩容

    2023年04月23日
    浏览(46)
  • 【C++STL标准库】序列容器之deuqe与、orwa_list与list

    基本概念这里就不再浪费时间去解释,这里给出deuqe与、orwa_list、list的基本使用方法: deque队列: forward_list单向列表: list双向链表: 如果发现文章中有错误,还请大家指出来,我会非常虚心地学习,我们一起进步!!!

    2024年02月15日
    浏览(40)
  • 24 标准模板库STL之算法1

    概述         算法是STL中用来处理容器中数据的一系列模板函数,可以对数据集合进行查找、排序、拷贝等操作。通过使用迭代器,算法可以运用在任意容器之上,做到与操作的数据的类型和结构无关。         STL算法博大精深,涵盖范围非常之广,一共提供了大约

    2024年02月05日
    浏览(36)
  • 25 标准模板库STL之算法2

    搜索算法         常用的搜索算法可参看下表。 函数名 算法描述 search 搜索迭代器区间中与另一个迭代器区间所有元素匹配的第一次的位置 search_n 搜索迭代器区间中与若干个相同元素匹配的第一次的位置 binary_search 以二分法在有序序列中查找指定值,找到返回true,否则

    2024年02月06日
    浏览(34)
  • 【C++STL标准库】算法,仿函数与空间适配器

    长得像函数,但是不是函数 实际上就是在类或结构体中重载了()运算符 结构体仿函数: 类仿函数: 使用: 运行截图: 基本概念这里就不浪费时间介绍了,代码中有介绍到,这里给出空间适配器的基本使用方式: 基本概念这里就不浪费时间介绍了,代码中有介绍到: 运

    2024年02月15日
    浏览(32)
  • C++ Qt开发:使用关联容器类

    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。 Qt 中提供了丰富的容器类,用于方便地管

    2024年02月05日
    浏览(41)
  • C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月25日
    浏览(51)
  • 深入探究C++中的STL:容器、迭代器与算法全解析

    Standard Template Library:标准模板库 是一个基于泛型的C++类模板库由Alexander Stepanov于1994年开发 其目的是为了提供一致通用和高效的数据结构和算法,同时不限制用户所处理的数据类型和编程范式。STL的原型最初由Andrew Koenig和其它C++专家小组进行设计并在1995年C++标准委员会的推

    2024年02月05日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包