#include <vector>
#include <algorithm>
#include <iostream>
class VertexFaceMap {
public:
struct Entry {
int vid;
std::vector<int> faces;
};
void addFace(int vid, int faceId) {
temp_data.push_back({vid, faceId});
}
void build() {
std::sort(temp_data.begin(), temp_data.end(),
[](const auto& a, const auto& b) { return a.vid < b.vid; });
mapping.clear();
mapping.reserve(temp_data.size());
for (size_t i = 0; i < temp_data.size(); ) {
int current_vid = temp_data[i].vid;
std::vector<int> faces;
while (i < temp_data.size() && temp_data[i].vid == current_vid) {
faces.push_back(temp_data[i].face);
++i;
}
mapping.push_back({current_vid, std::move(faces)});
}
temp_data.clear();
temp_data.shrink_to_fit();
}
const std::vector<int>* find(int vid) const {
auto it = std::lower_bound(mapping.begin(), mapping.end(), vid,
[](const Entry& e, int v) { return e.vid < v; });
if (it != mapping.end() && it->vid == vid) {
return &it->faces;
}
return nullptr;
}
size_t size() const { return mapping.size(); }
private:
struct Temp {
int vid;
int face;
};
std::vector<Temp> temp_data;
std::vector<Entry> mapping;
};
使用示例
int main() {
VertexFaceMap vmap;
vmap.addFace(10023, 0);
vmap.addFace(10023, 1);
vmap.addFace(5001, 2);
vmap.addFace(88888, 3);
vmap.addFace(88888, 4);
vmap.build();
if (auto faces = vmap.find(10023)) {
std::cout << "顶点 10023 对应的面片: ";
for (int f : *faces) std::cout << f << " ";
std::cout << "\n";
} else {
std::cout << "顶点 10023 不存在\n";
}
if (auto faces = vmap.find(42)) {
std::cout << "顶点 42 对应的面片数: " << faces->size() << "\n";
} else {
std::cout << "顶点 42 不存在\n";
}
return 0;
}