第8章:关联容器

1,关联容器的使用
2,源码

#include <iostream>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <set>
#include <vector>
#include <utility>


/*
关联容器:
1,关联容器是按关键词来保存和访问的,关联容器支持高效的关键字查找和访问;顺序容器是按元素顺序来保存和访问的
2,按关键字有序保存元素,容器添加元素后按顺序排列
map:        关联数组;保存关键字-值对
set:        关键字即值,即只保存关键字的容器
multimap:   关键字可重复出现的map
multiset:   关键字可重复出现的set
3,无序集合
unordered_map:     用哈希函数组织的map
unordered_set:     用哈希函数组织的set
unordered_multimpa: 哈希组织的map;关键字可以重复出现
unordered_multiset:哈希组织的set;关键字可以重复出现
4, pair标准库类型模板
5,类型别名和typdef具有相同的功能,关联容器的类型别名
key_type       此容器类型的关键字类型别名
mapped_type    每个关键字关联的类型别名;只适用于map
value_type     对于set,与key_type相同
               对于map,与pair<const key_type, mapped_type>相同
set<string>::value_type        v1      //v1是一个string类型
set<string>::key_type          V2      //v2是一个string类型
map<string, int>::value_type   v3      //v3是一个pair<const string, int>类型
map<string, int>:key_type      v4      //v4是一个string类型
map<string, int>::mapped_type  v5      //v5是一个int类型
6,添加元素
c.insert(v)               :v是value_type类型的对象
c.emplace(args)           :对于map和set,只有当元素的关键字不在c中时才插入元素
c.insert(b,e)             :b和e是迭代器
c.insert(il)              :花括号列表
7,删除元素
c.erase(k)                :从c中删除每个关键字为k的元素
c.erase(p)                :从c中删除迭代器p指定的元素
c.erase(b, e)             :删除迭代器对b和e所表示的范围中的元素
8,小标操作
c[k]
c.at[k]
9,访问元素
c.find(v)                 :返回一个迭代器
c.count(v)                :返回元素的数量,对multimap,multiset有用
10,不同访问元素的方法
lower_bound               :返回的迭代器将指向第一个具有给定关键字的元素
upper_bound               :返回的迭代器则指向最后一个匹配给定的关键字的元素之后的位置
11,不同查找元素的方式
equal_range:查找元素       :返回一个迭代器pair
12,无序元素的使用
13,管理桶
*/



using namespace std;
int main()
{
    /*map关联容器--------------------------------------------------------------------*/
    //给定的关键字只能有一个元素等于它,取第一次对应关键字的值
    map<string ,size_t> name_age = {{"xiaotao", 18},
                                    {"xiaojun", 22},
                                    {"xiaomei", 24},
                                    {"xiaotao", 20}};

    //temp_check指向name_age的某个元素,name_age的元素是pair
    for (const auto &temp_check : name_age)
    {
        cout << "Name Is " << temp_check.first << " Age is " << temp_check.second;
        cout << endl;
    }



    /*set关联容器-------------------------------------------------------------------*/
    set<string> name = {"xiaotao", "xiaojun", "xiaomei", "xiaotao"};

    for (const auto &temp_name : name)
    {
        cout << temp_name << endl;
    }



    /*multiset, multimap关联容器--------------------------------------------------*/
    multimap<string ,size_t> name_age2 = {{"xiaotao", 18},
                                    {"xiaojun", 22},
                                    {"xiaomei", 24},
                                    {"xiaotao", 20}};

    for (const auto &temp_check : name_age2)
    {
        cout << "Name Is " << temp_check.first << " Age is " << temp_check.second;
        cout << endl;
    }



    /*关联容器的迭代器------------------------------------------------------------*/
    map<string, size_t> name_age3 = {
                                     {"xiaotao", 18},
                                     {"xiaojun", 20}
                                    };
    auto temp_name_age = name_age3.begin();
    //pair->first为const类型不能进行赋值操作,pair->second可以进行赋值操作
    cout << temp_name_age->first << endl;
    cout << (temp_name_age->second = 22) << endl;

    set<int> num = {1,2,3,4,5,6,7,8,9,10};
    set<int>::iterator temp_num = num.begin();
    //set为const类型不能对元素进行修改
    while (temp_num != num.end())
    {
        cout << *temp_num++ << " ";
    }
    cout << endl;


    /*添加元素----------------------------------------------------------------*/
    vector<int> seq = {3,2,1,0};
    set<int>    seq1;

    //插入元素后按顺序排列
    seq1.insert(seq.begin(), seq.end());
    seq1.insert({4,5,6,7,8,8});
    for (const auto &temp_seq : seq1)
    {
        cout << temp_seq << " ";
    }
    cout << endl;

    map<string, int> Grap;
    Grap.insert({"zhang", 99});
    Grap.insert(make_pair("wang", 98));
    Grap.insert(pair<string, int>("li", 97));
    Grap.insert(map<string, int>::value_type("zhao", 96));
    for (const auto &temp_grap : Grap)
    {
        cout << temp_grap.first << " " << temp_grap.second << endl;
    }


    /*删除元素---------------------------------------------------------------*/
    Grap.erase("zhao");
    for (const auto &temp_grap : Grap)
    {
        cout << temp_grap.first << " " << temp_grap.second << endl;
    }


    /*map的下表操作----------------------------------------------------------*/
    Grap["zhang"] = 100;
    cout << Grap["zhang"] << endl;
    cout << Grap.at("li") << endl;


   /*find, cout查找指定元素--------------------------------------------------*/
   //返回迭代器
   auto temp_grap1 = Grap.find("zhang");
   //返回元素的个数
   auto temp_grap2 = Grap.count("li");
   cout << temp_grap1->second << endl;
   cout << temp_grap2 << endl;


   /*multimap find count使用-----------------------------------------------*/
   multimap<string, string>  Author_Book {{"bandao", "Happy"},
                                          {"start",  "Sad"},
                                          {"three",  "good"},
                                          {"bandao", "egg"},
                                         };
   auto temp_author_place = Author_Book.find("bandao");
   auto temp_author_num   = Author_Book.count("bandao");
   //因为是有序关联容器所以可以用此方法查找
   while (temp_author_num)
   {
       cout << temp_author_place->first << "  " << temp_author_place->second << endl;
       temp_author_place++;
       temp_author_num--;
   }


   /*lower_bound upper_bound方式查找元素---------------------------------------*/
   auto temp_author_author = Author_Book.lower_bound("bandao");
   while (temp_author_author != Author_Book.upper_bound("bandao"))
   {
       cout << temp_author_author->first << "  " << temp_author_author->second << endl;
       temp_author_author++;
   }

   /*equal_range 不同查找元素的方式---------------------------------------------*/
   for (auto pos = Author_Book.equal_range("bandao"); pos.first != pos.second; ++pos.first)
   {
        cout << pos.first->first << "  " << pos.first->second << endl;
   }


   /*无序元素的使用-----------------------------------------------------------*/
   unordered_map<string, string>  Unorder_Author_Book;
   Unorder_Author_Book.insert(Author_Book.begin(), Author_Book.end());
   Unorder_Author_Book.insert({"anyboy", "anything"});
   for (auto temp_unorder = Unorder_Author_Book.begin(); temp_unorder != Unorder_Author_Book.end(); temp_unorder++)
   {
      cout << temp_unorder->first << "  " << temp_unorder->second << endl;
   }




   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值