我正在将整数插入容器中。许多整数是重复的,在这种情况下,我只想插入一个。我预计最后一个容器中的项目不会超过100个(通常只有<10个)。
自然的解决方案是使用std::unordered_set或std::set。但是我仍然有一些疑问:
详细信息和背景:我使用常规3D网格在3D引擎中存储对象。一些对象重叠更多的单元格。当我检查哪些对象与对象A重叠时,我会遍历所有与A重叠的单元格并将所有对象插入每个单元格中
int findInCells( int n, int* cells, int* objects ){
std::unordered_set<int> found;
for(int i=0; i<n; i++){ // go over cells
auto range = map.equal_range( cells[i] ); // list all objects in std::unordered_multimap<int,int> map;
for(auto it = range.first; it != range.second; it++){ //
found.insert(it->second);
}
}
int io=0;
for(int o : found){ objects[io]=o; }
return io;
}
我正在尝试使其不比不关心重复的简单版本慢很多。
int findInCellsNaive( int n, int* cells, int* objects ){
// problem - what if we have same object in two different cells? we will insert it multiple times
int io=0;
for(int i=0; i<n; i++){ // go over cells
auto range = map.equal_range( cells[i] ); // list all objects in std::unordered_multimap<int,int> map;
for(auto it = range.first; it != range.second; it++){ //
outInds[io]=it->second;
io++;
}
}
return io;
}
我正在尝试的另一种解决方案是使用额外的布尔数组来“绘制”已插入的对象,该布尔数组的大小为所有对象的数量。
bool* painted = new bool[NOBJECTS];
for(int i=0; i<NOBJECTS; i++){ painted[o]=true; };
inline int findInCellsPaint( int n, int* cells, int* objects ){
int io=0;
for(int i=0; i<n; i++){ // go over cells
auto range = map.equal_range( cells[i] ); // list all objects in std::unordered_multimap<int,int> map;
for(auto it = range.first; it != range.second; it++){ //
int o = it->second;
if( painted[o] ){
objects[io]=o;
painted[o]=false;
io++;
}
}
}
for(int i=0; i<io; i++){ painted[objects[o]]=true; };
return io;
}