首页 > 编程语言 >C++ Primer学习笔记——第十一章

C++ Primer学习笔记——第十一章

时间:2023-11-13 23:46:17浏览次数:26  
标签:map set word 容器 第十一章 C++ 关键字 Primer occurs

第十一章 关联容器

前言

关联容器和顺序容器有着本质的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。(MySQL中元素就是按照关联容器进行保存)

关联容器支持高效的关键字查找和访问。两个主要的关联容器(associative-container)类型是map和set。

map中元素以[关键字-值](key-vale)方式存在,关键字起到索引的作用,值则表示与索引相关联的数据。

set中元素仅包含一个关键字,其支持高效的关键字查询操作。

标准库提供8个关联容器:

按关键字有序保存元素 解释
map 关联数组:保存关键字-值
set 关键字即值,即只保留关键字的容器
multimp 关键字可重复出现的map
multiset 关键字可重复出现的set
无序集合 解释
unordered_map 用哈希函数组织的map
unordered_set 用哈希函数组织的set
unordered_multimap 用哈希函数组织的map:关键字可以重复出现
unordered_multiset 用哈希函数组织的set:关键字可以重复出现

以上的8个容器的不同体现在三个维度:

  1. 每个容器要么是map,要么是set
  2. 容器要求要么是不重复的关键字,要么允许重复关键字
  3. 容器按照要么按照顺序存储,要么以无序存储

map与multimap定义在map头文件中;set和multiset定义在set头文件中;无序容器定义在unordered_mapunordered_set中。

11.1 使用关联容器

简单举例:

map类型通常被称为关联数组(associative array)。与一般数组类似,只不过其下标为关键字。例如:给定一个名字到电话号码的map,我们可以使用一个人的名字作为下标来获取此人的电话号码。

set本质就是关键字的简单集合

使用map

示例:

#include <iostream>
#include <string>
#include <map>

int main(){
    std::map<std::string,std::size_t> word_count;
    std::string word;
    while(std::cin>>word)
        ++word_count[word];
    cout<<"\n";
    for(const auto& w : word_count)
        std::cout<<w.first<<" occurs "<<w.second<<((w.second>1)?" times\n":" time\n");
    return 0;
}

RUN

$ gcc -o main -g main.cpp
$ ./main
hello world !
this is good !
this is bad !

! occurs 3 times
bad occurs 1 time
good occurs 1 time
hello occurs 1 time
is occurs 2 times
this occurs 2 times
world occurs 1 time

在上述示例代码中,map保存的每个元素中,关键字类型为std::string,值类型为std::size_t。 该示例中,将一个string作为下标,与此string相关联的size_t类型作为计数器。

当我们从map中提取一个元素时,会得到一个pair类型的对象。pair是一个模板类型,保存两个数据成员(first和second)。map所使用的pair用first成员保留关键字,second成员保存对应的值。

使用set

对于上面的扩展:合理忽略一些常见单词,如“the”、“and”、“or”、“is”等。

#include <iostream>
#include <string>
#include <map>
#include <set>

int main(){
    std::map<std::string,std::size_t> word_count{};
    std::set<std::string> exclude{  "The","But","And","Or","An","A","Is","!",
                                    "the","but","and","or","an","a","is"};
    std::string word;
    while(std::cin>>word)
        if (exclude.find(word) == exclude.end())
            ++word_count[word];

    std::cout<<"\n";
    for(const auto& w : word_count)
        std::cout<<w.first<<" occurs "<<w.second<<((w.second>1)?" times\n":" time\n");
    return 0;
}

RUN

$ gcc -o main -g main.cpp
$ ./main
hello world !
this is bad !
this is good !

bad occurs 1 time
good occurs 1 time
hello occurs 1 time
this occurs 2 times
world occurs 1 time

调用find函数会返回一个迭代器,如果找到word迭代器指向该关键字,否则返回一个尾后迭代器。

标签:map,set,word,容器,第十一章,C++,关键字,Primer,occurs
From: https://www.cnblogs.com/aaroncoding/p/17830612.html

相关文章

  • C++多态
    1、静态多态(1)函数重载 函数重载以参数的类型或数量不同来区分不同用途的同名函数。不以返回值不同来区分函数。编译器在调用函数时会在意函数的参数,不会在意函数的返回值。intmyAdd(inta,intb);floatmyAdd(doublea,doubleb);(2)运算符重载 使用关键字operator来......
  • C/C++知识补充
    运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符运算符描述实例+把两个操作数相加A+B将得到30-从第一个操作数中减去第二个操作数A-B将得到-10*把两个操作数相乘A*B将得到200/分子除以分母B/A将得到......
  • Linux Ubuntu部署C++环境与VS Code编辑器
      本文介绍在LinuxUbuntu操作系统下,配置VisualStudioCode软件与C++代码开发环境的方法。  在文章VMware虚拟机中安装LinuxUbuntu操作系统中,我们介绍了LinuxUbuntu操作系统的下载、安装方法;本文则基于前述基础,继续介绍在LinuxUbuntu操作系统中配置VisualStudioCode软......
  • C++ 字符串类 string
    @TOC前言在C++中,字符串是一种常见的数据类型,用于存储和操作文本数据。C++标准库中提供了std::string类,它是一个功能强大的字符串类,提供了丰富的方法和操作符,使我们能够轻松地处理字符串。一、string类型概括std::string是C++标准库中定义的字符串类,它在<string>头文件中声明。它......
  • 【C++】【图像处理】均值滤波和高斯滤波(低通滤波)算法解析(以.raw格式的图像为基础进行
    1voidmeanFilter(BYTE*image,intwidth,intheight,BYTE*outImg)2{3//均值滤波4intsmth[9];5inti,j,m,n;6BYTEblock[9];78//高斯卷积核初始化9smth[0]=1,smth[1]=2,smth[2]=1,10smth[3]=2,......
  • C++界面库(十几种,很全)
    C++界面库是用于GUI界面设计的工具包,可以帮助开发人员快速开发出美观、易用的界面。在选择C++界面库的时候,开发人员需要根据项目要求、使用场景、开发难易程度以及所适配的操作系统等因素进行综合考虑。 下面列举了十几种常见的C++界面库,简单介绍它们的安装、使用、特点和适用......
  • Android C++ 打印(调用)堆栈
    C++Android12编译依赖库:libutilscallstack头文件:#include<utils/CallStack.h>代码:CallStackstack;stack.update();stack.log("TAG");打印callingpid#include<binder/IPCThreadState.h>IPCThreadState::self()->getCallingPid(); //占位用......
  • C++编程爬虫代码全过程分享
    以下是使用C++编写一个爬虫程序的基本步骤和代码示例:1、首先,我们需要包含必要的库文件。在这个例子中,我们将使用<iostream>、<string>和<curlpp/cURLpp.hpp>库。#include<iostream>#include<string>#include<curlpp/cURLpp.hpp>#include<curlpp/Easy.hpp>#include<curlpp/......
  • 【1111算法题】蓝桥杯 c++(一)第一二题
    【1111算法题】第一题双十一的祈祷【算法赛】题目双十—,不仅是购物狂欢节,更有"光棍节"之称。这源于11:11由四个1构成,象征着单身。作为大学生的小蓝也想经历甜甜的校园恋爱,于是他找到了爱神丘比特,向他祈祷能为自己带来—段邂逅。丘比特是乐于助人的,他承诺小蓝只要回答出一个简......
  • 第十一章、web前端架构师
    目录二十四、自研统计服务,使作品能实现分渠道统计1、二十四、自研统计服务,使作品能实现分渠道统计1、......