unordered_map的emplace_back
时间: 2023-11-01 21:53:04 浏览: 189
`std::unordered_map`是C++标准库中的一个关联容器,提供了快速的键-值映射。`emplace_back`是一个向`std::unordered_map`中添加元素的方法。
然而,请注意,`emplace_back`是用于向容器类似于`std::vector`这样的序列容器添加元素的方法,并不适用于`std::unordered_map`。对于`std::unordered_map`,我们应该使用`emplace`或者`insert`方法来插入元素。
例如,可以使用`emplace`方法来插入元素:
```cpp
std::unordered_map<int, std::string> myMap;
myMap.emplace(1, "Hello");
myMap.emplace(2, "World");
```
或者使用`insert`方法:
```cpp
std::unordered_map<int, std::string> myMap;
myMap.insert(std::make_pair(1, "Hello"));
myMap.insert(std::make_pair(2, "World"));
```
以上两种方法都可以向`std::unordered_map`中插入元素。需要注意的是,如果键已经存在于`std::unordered_map`中,那么插入操作将不会执行,并且不会修改现有的键-值对。
希望这个回答能解决你的问题!如果还有其他问题,请随时提问。
相关问题
unordered_map的emplace_back方法
unordered_map并没有emplace_back方法。emplace_back是vector的方法,用于在容器的末尾直接构造一个新元素。
对于unordered_map,你可以使用emplace或者insert方法来插入新的键值对。emplace方法接受参数作为键和值的构造函数参数,并在容器中直接构造一个新的键值对。insert方法接受一个pair对象或者一个初始化列表,用于插入新的键值对。
下面是一个示例:
```cpp
#include <iostream>
#include <unordered_map>
int main() {
std::unordered_map<int, std::string> myMap;
myMap.emplace(1, "one");
myMap.insert(std::make_pair(2, "two"));
myMap.insert({3, "three"});
for (const auto& pair : myMap) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
```
输出结果:
```
1: one
2: two
3: three
```
以上代码使用了emplace和insert方法向unordered_map中插入了三个键值对,并且通过循环打印了所有的键和值。
#include <iostream> #include <unordered_map> #include <vector> using namespace std; int main() { // 存储每个节点的父节点和子节点 unordered_map<char, char> parent; unordered_map<char, vector<char>> children; // 读入数据 string line; while (getline(cin, line)) { char p = line[0]; char c = line[2]; parent[c] = p; children[p].push_back(c); } // 找到根节点 char root; for (auto& it : parent) { if (parent.find(it.second) == parent.end()) { root = it.second; break; } } // 先根遍历 vector<char> stack{root}; while (!stack.empty()) { char node = stack.back(); stack.pop_back(); cout << node << " "; if (children.find(node) != children.end()) { for (char child : children[node]) { stack.push_back(child); } } } return 0; }
这段代码已经非常简洁了,但是还有一些可以优化的地方:
1. 使用 auto 关键字可以简化代码。
2. 可以使用引用遍历 unordered_map,可以避免拷贝 map 中的数据。
3. 可以使用 emplace_back 函数来向 vector 中添加元素,可以避免拷贝元素。
4. 可以使用范围 for 循环来遍历 vector。
优化后的代码如下:
```
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
// 存储每个节点的父节点和子节点
unordered_map<char, char> parent;
unordered_map<char, vector<char>> children;
// 读入数据
string line;
while (getline(cin, line)) {
auto p = line[0], c = line[2];
parent[c] = p;
children[p].emplace_back(c);
}
// 找到根节点
char root;
for (auto& [child, par] : parent) {
if (parent.find(par) == parent.end()) {
root = par;
break;
}
}
// 先根遍历
vector<char> stack{root};
while (!stack.empty()) {
auto node = stack.back();
stack.pop_back();
cout << node << " ";
if (auto& children_vec = children[node]; !children_vec.empty()) {
for (auto child : children_vec) {
stack.emplace_back(child);
}
}
}
return 0;
}
```
希望对您有所帮助。