unordered_map.find用法
时间: 2023-10-12 11:14:34 浏览: 244
unordered_map.find() 是 C++ STL 中 unordered_map 容器提供的一个函数,用于在 unordered_map 中查找指定键的迭代器。例如,以下是 unordered_map.find() 的使用方法:
```
#include <iostream>
#include <unordered_map>
using namespace std;
int main()
{
unordered_map<string, int> mymap = {{"foo", 1}, {"bar", 2}, {"baz", 3}};
// 查找键为 "foo" 的元素
auto it = mymap.find("foo");
if (it != mymap.end()) {
cout << "Key found: " << it->first << ", value is " << it->second << endl;
} else {
cout << "Key not found." << endl;
}
return 0;
}
```
输出:
```
Key found: foo, value is 1
```
如果找到了指定键的元素,则返回指向该元素的迭代器。如果没有找到,则返回 unordered_map::end() 迭代器。
相关问题
boss_face_dir_data_vec.reserve(boss_faces.size()); std::unordered_map<Vector3d, int> boss_faces_dirs_map; for (int b = 0; b < boss_faces_dirs.size(); b++) { boss_faces_dirs_map[boss_faces_dirs[b]] = b + 1; } for (int a = 0; a < boss_faces.size(); a++) { double temp_dir1[3]; getFaceDir(boss_faces[a], temp_dir1); Vector3d temaa(temp_dir1[0], temp_dir1[1], temp_dir1[2]); auto it = std::find_if(boss_faces_dirs_map.begin(), boss_faces_dirs_map.end(),temaa){ return isEqual(temaa, temaa); }); BossFacesDirData boss_face_dir_data; boss_face_dir_data.dir_num = (it != boss_faces_dirs_map.end()) ? it->second : 0; std::copy_n(temp_dir1, 3, boss_face_dir_data.face_dir); boss_face_dir_data_vec.emplace_back(std::move(boss_face_dir_data)); if (boss_face_dir_data.dir_num > 20) { break; } } 改进这段代码
根据你提供的代码,我对其进行了一些改进。主要的改进包括:
1. 使用 `reserve` 方法为 `boss_face_dir_data_vec` 预分配足够的空间,避免不必要的内存重新分配。
2. 将 `boss_faces_dirs_map` 的键类型改为 `Vector3d`,以便与 `boss_faces_dirs` 中的元素类型匹配。
3. 在 `std::find_if` 中使用 lambda 表达式来进行查找,并修正了 `isEqual` 函数的调用。
4. 修正了 `temaa` 的使用,确保在 `std::find_if` 中正确地使用它。
下面是改进后的代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
struct BossFacesDirData {
int dir_num;
double face_dir[3];
};
bool isEqual(const Vector3d& dir1, const Vector3d& dir2) {
return (std::abs(dir1.x - dir2.x) < 0.001 &&
std::abs(dir1.y - dir2.y) < 0.001 &&
std::abs(dir1.z - dir2.z) < 0.001);
}
int main() {
std::vector<BossFacesDirData> boss_face_dir_data_vec;
boss_face_dir_data_vec.reserve(boss_faces.size());
std::unordered_map<Vector3d, int> boss_faces_dirs_map;
for (int b = 0; b < boss_faces_dirs.size(); b++) {
boss_faces_dirs_map[boss_faces_dirs[b]] = b + 1;
}
for (int a = 0; a < boss_faces.size(); a++) {
double temp_dir1[3];
getFaceDir(boss_faces[a], temp_dir1);
Vector3d temaa(temp_dir1[0], temp_dir1[1], temp_dir1[2]);
auto it = std::find_if(boss_faces_dirs_map.begin(), boss_faces_dirs_map.end(),
[&](const auto& pair) { return isEqual(pair.first, temaa); });
BossFacesDirData boss_face_dir_data;
boss_face_dir_data.dir_num = (it != boss_faces_dirs_map.end()) ? it->second : 0;
std::copy_n(temp_dir1, 3, boss_face_dir_data.face_dir);
boss_face_dir_data_vec.emplace_back(std::move(boss_face_dir_data));
if (boss_face_dir_data.dir_num > 20) {
break;
}
}
// 输出分组结果
for (const auto& data : boss_face_dir_data_vec) {
std::cout << "Dir Num: " << data.dir_num << ", Face Dir: " << data.face_dir[0] << ", "
<< data.face_dir[1] << ", " << data.face_dir[2] << std::endl;
}
return 0;
}
```
请注意,你需要确保 `Vector3d` 类型已正确定义,并且 `getFaceDir` 函数返回一个正确的方向向量。对于 `isEqual` 函数,你可能需要根据你的具体需求进行适当的修改。
unordered_map的find方法
unordered_map是C++ STL中的一个关联容器,它提供了一种将键映射到值的方法。unordered_map的find方法用于在容器中查找指定键的元素,其函数形式为:unordered_map变量名.find(要查找的键值)。如果找到了指定键的元素,则返回指向该元素的迭代器;否则,返回指向unordered_map尾部的迭代器end()。下面是一个例子:
假设我们有一个unordered_map<int, string> map,其中包含以下键值对:{1: "one", 2: "two", 3: "three"}。我们可以使用find方法查找键为2的元素:
```c++
unordered_map<int, string> map = {{1, "one"}, {2, "two"}, {3, "three"}};
auto it = map.find(2);
if (it != map.end()) {
cout << "Found element with key " << it->first << " and value " << it->second << endl;
} else {
cout << "Element not found" << endl;
}
```
输出结果为:
```
Found element with key 2 and value two
```
阅读全文