C++:无法理解此代码
C++: Can't understand this code
这里是网站:链接。
这是我不明白的部分:
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>
中的类型 iterator
是 vector<L>
中的类型 iterator
的别名。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值