133:图的克隆
参考:
- c++11 之emplace_back 与 push_back的区别:https://blog.csdn.net/p942005405/article/details/84764104
- c++ map与unordered_map区别及使用:https://blog.csdn.net/qq_21997625/article/details/84672775
- unordered_map:https://en.cppreference.com/w/cpp/container/unordered_map
题目详解
- 图的克隆
- 使用一个map 来表示已经访问过的节点,如果已经访问过,就直接返回
- 没有访问过,则构造一个节点
- 节点的val直接复制
- 节点的neighbour使用emplace_back进行设置
class Solution {
public:
unordered_map<Node *,Node *> visited;
Node* cloneGraph(Node* node) {
if(node == nullptr){
return node;
}
// 节点已经被遍历到,那么就直接返回
if(visited.find(node) != visited.end()){
return visited[node];
}
Node * cloneNode = new Node(node->val);
visited[node] = cloneNode;
for(auto & neighbour : node->neighbors){
cloneNode->neighbors.emplace_back(cloneGraph(neighbour));
}
return cloneNode;
}
};
1:Unordered__map
- 引入了哈希表,使得查找的时候更加的方便
2:Auto
- 申明变量的时候根据初始的表达式自动的推断变量类型(必须有初始值)
- 声明函数时函数返回值的占位符
- auto 不能和其他的类型一起使用
for(auto it = vect.begin(); it != vect.end(); it++){
cin >> *it;
}
auto int i = 0 // 错误的
3:Emplace_back
- 和push_back的区别
- 在对右值引用进行操作的时候,我们会用构造函数构造成临时对象,再通过拷贝构造函数将这个临时对象放入到容器中,原来的临时变量释放。这样就会造成临时变量申请资源的浪费
- emplace_back
- 在容器的尾部添加一个元素,原地构造,不需要触发拷贝构造和转移构造