vector<BossFacesDirData> boss_face_dir_data_vec; boss_face_dir_data_vec.clear(); for (int a = 0; a < boss_faces.size(); a++) { boss_face_dir_data.dir_num = 0; double temp_dir1[3]; getFaceDir(boss_faces[a], temp_dir1); int is_eq = 0; for (int b = 0; b < boss_faces_dirs.size(); b++) { double temp_dir2[3]; temp_dir2[0] = boss_faces_dirs[b].X; temp_dir2[1] = boss_faces_dirs[b].Y; temp_dir2[2] = boss_faces_dirs[b].Z; UF_VEC3_is_equal(temp_dir1, temp_dir2, 0.001, &is_eq); if (is_eq) { boss_face_dir_data.dir_num = b + 1; } } if (boss_face_dir_data.dir_num > 20) { break; } UF_VEC3_copy(temp_dir1, boss_face_dir_data.face_dir); boss_face_dir_data_vec.push_back(boss_face_dir_data); continue; 改进这段代码
时间: 2024-04-17 14:28:13 浏览: 110
根据你提供的代码,我对其进行了一些改进。主要的改进包括:
1. 使用 `std::vector` 的 `emplace_back` 方法来避免不必要的复制操作。
2. 使用 `std::find_if` 算法来查找具有相同方向的面的索引。
3. 使用 `std::unordered_map` 来存储面的方向向量,以便进行快速查找。
下面是改进后的代码:
```cpp
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
struct BossFacesDirData {
int dir_num;
double face_dir[3];
};
bool isEqual(const double* dir1, const double* dir2) {
return (std::abs(dir1[0] - dir2[0]) < 0.001 &&
std::abs(dir1[1] - dir2[1]) < 0.001 &&
std::abs(dir1[2] - dir2[2]) < 0.001);
}
int main() {
std::vector<BossFacesDirData> boss_face_dir_data_vec;
boss_face_dir_data_vec.reserve(boss_faces.size());
std::unordered_map<std::array<double, 3>, int> boss_faces_dirs_map;
for (int b = 0; b < boss_faces_dirs.size(); b++) {
boss_faces_dirs_map[{boss_faces_dirs[b].X, boss_faces_dirs[b].Y, boss_faces_dirs[b].Z}] = b + 1;
}
for (int a = 0; a < boss_faces.size(); a++) {
double temp_dir1[3];
getFaceDir(boss_faces[a], temp_dir1);
auto it = std::find_if(boss_faces_dirs_map.begin(), boss_faces_dirs_map.end(),
[&](const auto& pair) { return isEqual(pair.first.data(), temp_dir1); });
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;
}
```
请注意,上述代码中的 `isEqual` 函数用于比较两个方向向量是否相等。你可能需要根据你的具体需求进行适当的修改。此外,我假设你已经实现了 `getFaceDir` 函数来获取面的方向向量,并且 `boss_faces` 和 `boss_faces_dirs` 分别表示面和面方向的数据。
阅读全文