C++:无法理解此代码

C++: Can't understand this code

本文关键字:代码 C++      更新时间:2023-10-16

这里是网站:链接。

这是我不明白的部分:

template<typename L>
struct Graph {
  typedef L Location;
  typedef typename vector<Location>::iterator iterator;
  unordered_map<Location, vector<Location> > edges;
  inline const vector<Location>  neighbors(Location id) {
    return edges[id];
  }
};

我不明白的是这些台词:

typedef typename vector<Location>::iterator iterator;
      unordered_map<Location, vector<Location> > edges;
      inline const vector<Location>  neighbors(Location id) {
        return edges[id];
      }

第一行是我最困惑的,做什么

vector<Location>::iterator iterator

做?它是一个函数吗?类型?:: 在这行代码中做什么?

对于第二行,我已经搜索了unordered_maps是什么,似乎位置是键,矢量是映射值?这是对的吗?

关于第三行和第四行,内联不必在那里,对吧?我查看了维基百科页面,但它太复杂了,我现在无法理解。除了内联之外,代码到底做了什么?邻居(位置 ID(有什么作用?我认为这是邻居的参数,但什么是边缘[id]?它是否从unordered_map边缘返回密钥 ID 的映射值?

对不起,如果这一切都是错误的,我不知道很多算法,几乎没有,事实上,现在我正在尝试为我的吃豆人游戏学习 A*,所以我认为存在很大的知识差距。

typedef typename vector<Location>::iterator iterator;

这将定义映射到 vector<Location>::iterator 的新类型别名iterator。不过,typedef 本身实际上并没有用在这段代码中。

unordered_map<Location, vector<Location> > edges;

这将定义一个std::unordered_map http://www.cplusplus.com/reference/unordered_map/unordered_map/edges其中Location(模板化类型(是键值,Location s 的std::vector是映射值。

似乎位置是关键,矢量是映射值?是 这个对吧?

没错,可以通过访问对的first成员来访问Location,而可以通过访问对的second成员来访问向量。

 inline const vector<Location>  neighbors(Location id) {
        return edges[id];
      }

inline告诉编译器,它不应该将函数视为实际函数,但它应该将函数体中的代码替换为调用代码:

Graph<int> graph;
auto result = graph.neighbors(5);

通过内联此代码,此代码将转换为:

Graph<int> graph;
auto result = graph.edges[id];

请注意,inline只是一个提示,编译器实际上不必侦听它。

typedef typename vector<Location>::iterator iterator;

定义图形模板中的类型别名。 它具有以下一般形式:

typedef X Y;

这使得 Y 成为类型 X 的别名。在这种情况下,X 是

typename vector<Location>::iterator

具有以下形式

typename A::B

这意味着 A 类中的 B 型。 在这种情况下,typename关键字是必需的,因为它依赖于模板参数vector<Location>

最终结果是 Graph<L> 中的类型 iteratorvector<L> 中的类型 iterator 的别名。