服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++ primer超详细讲解关联容器

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

2023-02-16 15:10扑街男孩 C/C++

两个主要的关联容器为map和set,map中元素是一些关键字—值对,关键字起索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字,set支持高效的关键字查询操作——检查一个给定关键字是否在set中

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

使用关联容器

(1)经典的map程序

单词计数程序

?
1
2
3
4
5
6
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的使用

?
1
2
3
4
5
6
7
8
9
10
//忽略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使用的例子:

?
1
2
3
4
5
6
7
8
9
10
11
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,我们可以对返回值进行列表初始化

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

关联容器操作

关联容器迭代器

?
1
2
3
4
5
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迭代器来读取元素的值,但不能修改

?
1
2
3
4
5
6
7
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包含不重复的关键字,因此插入一个存在的元素对容器无影响。

?
1
2
3
4
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++关联容器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_42375706/article/details/125492448

延伸 · 阅读

精彩推荐
  • C/C++浅析C语言中的数组及字符数组

    浅析C语言中的数组及字符数组

    这篇文章主要介绍了C语言中的数组及字符数组,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网5942021-03-17
  • C/C++.h和.cpp文件的区别(zt)详细介绍

    .h和.cpp文件的区别(zt)详细介绍

    特别是对源文件和头文件的概念,需要深入对它了解,本文将详细介绍,需要了解的朋友可以参考下...

    C++教程网6802020-11-12
  • C/C++C语言实现简单的图书管理系统

    C语言实现简单的图书管理系统

    这篇文章主要为大家详细介绍了C语言实现简单的图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Sriven9642021-10-27
  • C/C++C/C++中*和&的用法详解

    C/C++中*和&的用法详解

    在本篇文章中我们给大家总结了C/C++中*和&的用法以及相关的代码分享,有兴趣的朋友赶紧学习下吧。...

    彩虹糖梦9542021-06-22
  • C/C++在C语言中调用C++做的动态链接库

    在C语言中调用C++做的动态链接库

    如果你有一个c++做的动态链接库.so文件,而你只有一些相关类的声明,那么你如何用c调用呢,别着急,本文通过一个小小的例子,让你能够很爽的搞定....

    99re4262021-04-01
  • C/C++C语言实现扫雷小程序

    C语言实现扫雷小程序

    这篇文章主要为大家详细介绍了C语言实现扫雷小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    还小给个面子12342021-12-09
  • C/C++C语言从猜数字游戏中理解数据结构

    C语言从猜数字游戏中理解数据结构

    猜数字是兴起于英国的益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。游戏规则为一方出数字,一方猜,今天我们...

    ypandam5292022-11-09
  • C/C++C语言编程时常犯十八个错误小结

    C语言编程时常犯十八个错误小结

    C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活的余地”,但还是由于这...

    C语言教程网4042020-12-19