C++ primer超详细讲解关联容器

目录
  • 使用关联容器
  • 关联容器概述
    • 定义关联容器
    • pair类型
  • 关联容器操作
    • 关联容器迭代器
    • 添加元素
    • 删除元素
    • map的下标操作
    • 访问元素

允许重复关键字的容器的名字开中都有包含单词multi,不保持关键字按顺序存储的容器的名字都以unordered开头。

使用关联容器

(1)经典的map程序

单词计数程序

map<string, size_t>word_count;
string word;
while (cin >> word)
	++word_count[word];
for (const auto& w : word_count)
	cout << w.first << " occurs " << w.second << " 次 " << endl;

(2)set的使用

//忽略exclude中的单词进行计数
map<string, size_t>word_count;
set<string> exclude = { "the","but" };
string word;
while (cin >> word)
	if(exclude.find(word)==exclude.end())
//find返回一个迭代器,指向该关键字,若不存在,则返回尾后迭代器
		++word_count[word];
for (const auto& w : word_count)
	cout << w.first << " occurs " << w.second << " 次 " << endl;

关联容器概述

定义关联容器

(1)mutiset使用的例子:

vector<int> v;
for (int i = 0; i != 10; i++)
{
	v.push_back(i);
	v.push_back(i);
}
set<int> is(v.begin(), v.end());
multiset<int> ms(v.begin(), v.end());
cout << is.size() << endl;  //输出10
cout << ms.size() << endl;  //输出20
cout << v.size() << endl;   //输出20

pair类型

创建一个pair时,我们必须提供两个类型。

pair<string,int> p;

其中两个成员分别命名为first和second,可以采用成员访问符访问他们。

创建pair对象的函数

有一个函数需要返回一个pair,我们可以对返回值进行列表初始化

pair<string,int> process(vector<string> &v)
{
    //处理v
    if(!v.empty())
        return { v.back(),v.back().size()}  //列表初始化
    else
        return pair<string,int>(); //隐式构造返回值
}

关联容器操作

关联容器迭代器

map<string,int> v;
auto map_it=v.begin()  //获取一个指向v中一个元素的迭代器
//map_it是指向一个pair<const string,size_t>对象的引用
cout<<map_it->first;  //打印此元素的关键字
cout<<map_it->second  //打印此元素的值

(1)set的迭代器是const的

set的迭代器只允许只读访问set中的元素,set中的关键字也是const的,可以用一个set迭代器来读取元素的值,但不能修改

set<int> s = { 0,1,2,3,4,5,6 };
set<int>::iterator it = s.begin();
if (it != s.end())
{
	*it = 42;  //无法修改
	cout << *it << endl;
}

添加元素

关联容器的insert成员向容器中添加一个元素或一个元素范围,由于map和set包含不重复的关键字,因此插入一个存在的元素对容器无影响。

vector<int> ivec={2,4,6,8}
set<int> set2;
set2.insert(ivec.begin(),ivec.end())
set2.insert({1,3,5,7})

insert有两个版本,分别接受一对迭代器,或是一个初始化器列表。

(1)向map添加元素

m.insert({word,1})

(2)insert的返回值

对于不包含重复关键字的容器,添加单一元素的insert版本返回一个pair,pair的first成员是一个迭代器,指向具有给定关键字的元素,second成员是一个bool的值,指出元素是插入成功还是已经存在于容器中,如果关键字已在容器中,则insert什么也不做,且返回值中的bool部分为false,若关键字不存在,元素被插入到容器中,且bool值为true。

删除元素

关联容器定义了三个版本的erase,可传递一个迭代器或一个迭代器对来删除一个元素或一个元素范围,指定元素被删除后返回void。

另一个版本没接收一个key_type参数,此版本删除所有匹配给定关键字的元素,返回实际删除的元素数量。

map的下标操作

map的下标运算符接受一个索引(即关键字),获取与此关键字相关联的值,若关键字不在map中,则会为其创建一个元素并插入到map中,关键值将进行值初始化。

访问元素

c.find(k):返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器

c.count(k):返回关键字等于k的元素数量,对于不允许重复关键字的容器,返回值永远是0或1

关键容器还提供两个特殊的函数,lower_bound和upper_bound,lower_bound返回的迭代器将指向第一个具有给定关键字的元素,而upper_bound返回的迭代器指向最后一个匹配给定关键的元素之后的位置。

到此这篇关于C++ primer超详细讲解关联容器的文章就介绍到这了,更多相关C++关联容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++Primer笔记之关联容器的使用详解

    关联容器 关联容器支持通过键来高效地查找和读取元素.两个基本的关联容器类型是map和set.map的元素以键-值对的形式组织:键用作元素在map的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set和map类型的对象不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用multimap或mutiset类型,这两种类型允许多个元素拥有相同的键. pair类型:在头文件utility中定义. pair的创建和使用: 复制代码 代码如下:

  • C++ primer超详细讲解关联容器

    目录 使用关联容器 关联容器概述 定义关联容器 pair类型 关联容器操作 关联容器迭代器 添加元素 删除元素 map的下标操作 访问元素 允许重复关键字的容器的名字开中都有包含单词multi,不保持关键字按顺序存储的容器的名字都以unordered开头. 使用关联容器 (1)经典的map程序 单词计数程序 map<string, size_t>word_count; string word; while (cin >> word) ++word_count[word]; for

  • C++ primer超详细讲解顺序容器

    目录 顺序容器概述 容器库概览 迭代器 容器定义和初始化 赋值和swap 顺序容器操作 向顺序容器添加元素 访问元素 删除元素 特殊的forwa_list单向链表操作 改变容器大小 vector对象是如何增长的 定义:一个容器就是一个特定类型对象的集合. 顺序容器概述 (1)顺序容器类型 vector:可变数组大小,支持快速访问 deque:双端队列,支持快速随机访问,在头尾位置插入/删除速度很快 forward_list:单向链表,只支持单向顺序访问. array:固定大小数组,不能添加或删除

  • C++ primer超详细讲解泛型算法

    目录 初识泛型算法 只读算法 写容器算法 定制操作 lambda表达式 lambda捕获和返回 再探迭代器 插入迭代器 iostream迭代器 反向迭代器 初识泛型算法 只读算法 只读取输入范围内的函数,不改变元素,find,accumula也是如此 (1)accumulate算法为求和算法,前两个参数指出求和元素范围,第三个是和的初值,例: int sum=accumulate(v.begin(),v.end(),0) (2)操作两个序列的算法 equal算法,确定两个序列是否保存相同的值,将

  • SpringBoot嵌入式Servlet容器与定制化组件超详细讲解

    目录 嵌入式Servlet容器 1.原理分析 2.Servlet容器切换 3.定制Servlet容器配置 定制化组件 嵌入式Servlet容器 在Spring Boot中,默认支持的web容器有 Tomcat, Jetty, 和 Undertow 1.原理分析 那么这些web容器是怎么注入的呢?我们一起来分析一下 当SpringBoot应用启动发现当前是Web应用,它会创建一个web版的ioc容器ServletWebServerApplicationContext 这个类下面有一个createW

  • 超详细讲解Java线程池

    目录 池化技术 池化思想介绍 池化技术的应用 如何设计一个线程池 Java线程池解析 ThreadPoolExecutor使用介绍 内置线程池使用 ThreadPoolExecutor解析 整体设计 线程池生命周期 任务管理解析 woker对象 Java线程池实践建议 不建议使用Exectuors 线程池大小设置 线程池监控 带着问题阅读 1.什么是池化,池化能带来什么好处 2.如何设计一个资源池 3.Java的线程池如何使用,Java提供了哪些内置线程池 4.线程池使用有哪些注意事项 池化技术

  • Java 超详细讲解设计模式之中的抽象工厂模式

    目录 抽象工厂模式 1.什么是抽象工厂 2.抽象工厂模式的优缺点 3.抽象工厂模式的结构与实现 4.抽象工厂方法模式代码实现 5.抽象工厂模式的应用场景 6.抽象工厂模式的扩展 抽象工厂模式 前面文章介绍的工厂方法模式中考虑的是一类产品的生产,比如案例中的百事可乐工厂只能生产百事可乐,可口可乐工厂只能生产可口可乐,也就是说:工厂方法模式只考虑生产同等级的产品. 1.什么是抽象工厂 在现实生活中许多工厂是综合型的工厂,能生产多种类)的产品,就拿案例里面的可乐来说,在节日的时候可能会有圣诞版的可乐,

  • Java超详细讲解设计模式之一的工厂模式

    目录 工厂模式 1.简单工厂 1.1结构 1.2实现 1.3优缺点 1.4扩展 2.工厂方法 2.1结构 2.2实现 2.3优缺点 3.抽象工厂 3.1结构 3.2实现 3.3优缺点 4.模式扩展 4.1实现 工厂模式 在Java应用程序中对象无处不在,这些对象都需要进行创建,如果创建的时候直接new对象,那么如果我们要更换对象,所有new对象的地方都需要进行更改.违背了软件设计原则中的开闭原则.如果我们使用工厂生产对象,只需要在工厂中关注对象的改变即可,达到了与对象解耦的目的,工厂模式最大的特

  • Android超详细讲解组件LinearLayout的使用

    目录 概述 常用XML配置属性 (1) android:orientation (2) android:gravity (3) View中继承来的属性 代码举例 概述 LinearLayout是线性布局组件,放置在其中的组件按列或者按行(就是垂直或者水平)的方式排序分布. 常用XML配置属性 (1) android:orientation 设置LinearLayout容器布局组件的方式:只能取值:horizontal(水平的),vertical(垂直的) (2) android:gravity

  • Android超详细讲解组件ScrollView的使用

    目录 概述 练习 HorizontalScrollView: 概述 ScrollView也是一个容器,它是FrameLayout的子类,它的主要作用就是将超出物理屏幕的内容显示出来,(就是滚动条效果)ScrollView提供垂直滚动,进而可将超出物理屏幕的内容显示出来. 在一般情况下,可以将一个采用垂直方式布局组件的LinearLayout作为ScrollLayout容器的子组件,同时,在LinearLayout容器中可以显示超出屏幕物理高度的内容. 练习 这么说有点抽象,然后我们现在实现完成一

  • 超详细讲解Java秒杀项目登陆模块的实现

    目录 一.项目前准备 1.新建项目 2.导入依赖 3.执行sql脚本 4.配置yml文件 5.在启动类加入注解 6.自动生成器 二.前端构建 1.导入layui 2.将界面放到template 3.在js目录下新建目录project 4.新建controller类 三.MD5加密 1.导入帮助包与exception包 2.新建vo类 3.登录方法: 4.密码加密 四. 全局异常抓获 1.给实体类userVo加入注解 2.导入帮助包validate,异常抓获 3.在UserController类方

随机推荐