文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++的Boost Bimap怎么使用

2023-07-04 13:27

关注

这篇文章主要介绍了C++的Boost Bimap怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++的Boost Bimap怎么使用文章都会有所收获,下面我们一起来看看吧。

一、提要

库 Boost.Bimap 基于 Boost.MultiIndex 并提供了一个无需先定义即可立即使用的容器。该容器类似于 std::map,但支持从任一侧查找值。 Boost.Bimap 允许您根据访问地图的方式创建任意一侧都可以作为关键点的地图。当您访问左侧作为键时,右侧是值,反之亦然。

二、示例

Example13.1.Usingboost::bimap

#include <boost/bimap.hpp>#include <string>#include <iostream>int main(){  typedef boost::bimap<std::string, int> bimap;  bimap animals;  animals.insert({"cat", 4});  animals.insert({"shark", 0});  animals.insert({"spider", 8});  std::cout << animals.left.count("cat") << '\n';  std::cout << animals.right.count(8) << '\n';}

boost::bimap 定义在 boost/bimap.hpp 中,提供了两个成员变量 left 和 right ,可用于访问 boost::bimap 统一的两个 std::map 类型的容器。在示例 13.1 中,left 使用 std::string 类型的键来访问容器,而 right 使用 int 类型的键。

除了支持使用左侧或右侧容器访问单个记录外,boost::bimap 还允许您将记录视为关系(参见示例 13.2)。

示例 13.2。访问关系

#include <boost/bimap.hpp>#include <string>#include <iostream>int main(){  typedef boost::bimap<std::string, int> bimap;  bimap animals;  animals.insert({"cat", 4});  animals.insert({"shark", 0});  animals.insert({"spider", 8});  for (auto it = animals.begin(); it != animals.end(); ++it)    std::cout << it->left << " has " << it->right << " legs\n";}

不必使用左或右访问记录。通过迭代记录,单个记录的左右部分可通过迭代器获得。

虽然 std::map 附带一个名为 std::multimap 的容器,它可以使用相同的键存储多条记录,但 boost::bimap 没有这样的等价物。但是,这并不意味着在 boost::bimap 类型的容器中存储具有相同键的多条记录是不可能的。严格来说,两个必需的模板参数指定左和右的容器类型,而不是要存储的元素的类型。如果未指定容器类型,则默认使用容器类型 boost::bimaps::set_of。此容器与 std::map 一样,仅接受具有唯一键的记录。

示例 13.3。显式使用 boost::bimaps::set_of

#include <boost/bimap.hpp>#include <string>#include <iostream>int main(){  typedef boost::bimap<boost::bimaps::set_of<std::string>,    boost::bimaps::set_of<int>> bimap;  bimap animals;  animals.insert({"cat", 4});  animals.insert({"shark", 0});  animals.insert({"spider", 8});  std::cout << animals.left.count("spider") << '\n';  std::cout << animals.right.count(8) << '\n';}

示例 13.3 指定了 boost::bimaps::set_of。

除了 boost::bimaps::set_of 之外的其他容器类型可用于自定义 boost::bimap。

示例 13.4。使用 boost::bimaps::multiset_of 允许重复

#include <boost/bimap.hpp>#include <boost/bimap/multiset_of.hpp>#include <string>#include <iostream>int main(){  typedef boost::bimap<boost::bimaps::set_of<std::string>,    boost::bimaps::multiset_of<int>> bimap;  bimap animals;  animals.insert({"cat", 4});  animals.insert({"shark", 0});  animals.insert({"dog", 4});  std::cout << animals.left.count("dog") << '\n';  std::cout << animals.right.count(4) << '\n';}

Example13.4

示例 13.4 使用容器类型 boost::bimaps::multiset_of,它在 boost/bimap/multiset_of.hpp 中定义。它的工作方式类似于 boost::bimaps::set_of,除了键不需要是唯一的。示例 13.4 将在搜索有四条腿的动物时成功显示 2。

因为 boost::bimaps::set_of 默认用于 boost::bimap 类型的容器,所以不需要显式包含头文件 boost/bimap/set_of.hpp。但是,当使用其他容器类型时,必须包含相应的头文件。

除了上面显示的类之外,Boost.Bimap 还提供以下类:boost::bimaps::unordered_set_of、boost::bimaps::unordered_multiset_of、boost::bimaps::list_of、boost::bimaps::vector_of 和 boost: :bimaps::unconstrained_set_of。除了 boost::bimaps::unconstrained_set_of,所有其他容器类型都像标准库中的对应容器一样运行。

示例 13.5。使用 boost::bimaps::unconstrained_set_of 禁用一侧

#include <boost/bimap.hpp>#include <boost/bimap/unconstrained_set_of.hpp>#include <boost/bimap/support/lambda.hpp>#include <string>#include <iostream>int main(){  typedef boost::bimap<std::string,    boost::bimaps::unconstrained_set_of<int>> bimap;  bimap animals;  animals.insert({"cat", 4});  animals.insert({"shark", 0});  animals.insert({"spider", 8});  auto it = animals.left.find("cat");  animals.left.modify_key(it, boost::bimaps::_key = "dog");  std::cout << it->first << '\n';}

boost::bimaps::unconstrained_set_of 可用于禁用 boost::bimap 的一侧。在示例 13.5 中,boost::bimap 的行为类似于 std::map。您无法访问通过腿搜索动物的权利。

示例 13.5 说明了为什么首选 boost::bimap 而不是 std::map 的另一个原因。由于 Boost.Bimap 基于 Boost.MultiIndex,因此 Boost.MultiIndex 的成员函数可用。示例 13.5 使用 modify_key() 修改密钥&mdash;&mdash;这是 std::map 无法实现的。

注意密钥是如何修改的。使用 boost::bimaps::_key 为当前键分配一个新值,这是一个在 boost/bimap/support/lambda.hpp 中定义的占位符。

boost/bimap/support/lambda.hpp 还定义了 boost::bimaps::_data。调用成员函数 modify_data() 时,boost::bimaps::_data 可用于修改 boost::bimap 类型容器中的值。

练习

使用 Boost.Bimap 实现类animals_container:

#include <boost/optional.hpp>#include <string>#include <vector>#include <iostream>struct animal{    std::string name;    int legs;    animal(std::string n, int l) : name(n), legs(l) {}};class animals_container{public:    void add(animal a)    {        // TODO: Implement this member function.    }    boost::optional<animal> find_by_name(const std::string &name) const    {        // TODO: Implement this member function.        return {};    }    std::vector<animal> find_by_legs(int from, int to) const    {        // TODO: Implement this member function.        return {};    }};int main(){    animals_container animals;    animals.add({ "cat", 4 });    animals.add({ "ant", 6 });    animals.add({ "spider", 8 });    animals.add({ "shark", 0 });    auto shark = animals.find_by_name("shark");    if (shark)        std::cout << "shark has " << shark->legs << " legs\n";    auto animals_with_4_to_6_legs = animals.find_by_legs(4, 7);    for (auto animal : animals_with_4_to_6_legs)        std::cout << animal.name << " has " << animal.legs << " legs\n";}

关于“C++的Boost Bimap怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C++的Boost Bimap怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯