【问题标题】:How do I make a map using a struct in C++?如何使用 C++ 中的结构制作地图?
【发布时间】:2020-07-15 00:05:42
【问题描述】:

我想要做的是使用 C++ struct 来制作一个简单的地图。

例如,

如果我有

struct Map { char name; int age };
Map MapObj[] = { {'charles', 10}, {'kate', 20}, {'nate', 10} } 

如何使用地图了解凯特的年龄? 我试过 MapjObj['kate'] 但它不起作用。 如何使用名称访问年龄?

【问题讨论】:

  • 我的意思是最简单的方法是在内部使用 std::map 但假设您出于任何原因尝试自己制作,您需要了解重载运算符 - 特别是 operator[] .你可以在网上找到std::map的接口,你只需要模仿它
  • “简单地图”通常通过hash map 实现。您缺少的是我们使用一种称为 Hash Function 的算法将字符串编码为数组中的唯一索引位置。
  • 您是在实现红/黑树还是 B-Tree 或类似的东西?
  • 你需要学习更多关于 C++ 的基础知识。了解单字符和字符串、单引号和双引号之间的区别。
  • char name; 我想你也不想这样。 c++ 中的字符串是 std::strimg char 是单个字符。喜欢a

标签: c++ dictionary struct using


【解决方案1】:

您可以使用 C++ 提供的 <algorithm> 工具,特别是 - std::find;类似:

auto pos = std::find(
    std::begin(MapOjb), 
    std::end(MapObj),
    [](const Map& m) { return m == "kate"}
);

但请注意:

  1. name 必须是 std::stringchar *(在后一种情况下,您将使用 strcmp(),而不是纯字符串比较)。
  2. MapMapObj 是非常糟糕的名称选择...

将您创建的数组的开头和结尾以及一个 lambda 函数传递给它。

【讨论】:

  • 您可以使用std::size() 来获取许多标准容器的元素计数,包括固定数组:std::find(MapOjb, MapOjb + std::size(MapObj), ...) 更好的是,您可以使用std:begin()/std::end() 代替,它已经专门用于许多容器,包括固定数组:std::find(std::begin(MapOjb), std::end(MapOjb), ...)
  • 我怀疑仍然处于找出字符和字符串之间的差异阶段的人是否会深入了解<algorithm> 嗯....手动编写的查找函数(即使用 for 循环)可能适合添加为更易于理解的替代解决方案。
  • @RemyLebeau:嗯,很高兴知道。我已经习惯于在原始数组上使用跨度,或者首先创建一个std::array
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-07
相关资源
最近更新 更多