我有一个函数可以将网格中点列表的所有邻居都移到一定距离,这涉及到很多重复项(我邻居的邻居 == 我又一次)。
我一直在尝试几种不同的解决方案,但我不知道哪个更有效。下面是一些代码,演示了两个并行运行的解决方案,一个使用 std::vector sort-unique-erase,另一个使用 std::copy 到 std::unordered_set。
我还尝试了另一种解决方案,即将包含迄今为止邻居的向量传递给邻居函数,该函数将使用 std::find 确保在添加邻居之前不存在邻居。
所以三个解决方案,但我不能完全围绕哪个会更快。有什么想法吗?
代码片段如下:
// Vector of all neighbours of all modified phi points, which may initially include duplicates.
std::vector<VecDi> aneighs;
// Hash function, mapping points to their norm distance.
auto hasher = [&] (const VecDi& a) {
return std::hash<UINT>()(a.squaredNorm() >> 2);
};
// Unordered set for storing neighbours without duplication.
std::unordered_set<VecDi, UINT (*) (const VecDi& a)> sneighs(phi.dims().squaredNorm() >> 2, hasher);
... compute big long list of points including many duplicates ...
// Insert neighbours into unordered_set to remove duplicates.
std::copy(aneighs.begin(), aneighs.end(), std::inserter(sneighs, sneighs.end()));
// De-dupe neighbours list.
// TODO: is this method faster or slower than unordered_set?
std::sort(aneighs.begin(), aneighs.end(), [&] (const VecDi& a, const VecDi&b) {
const UINT aidx = Grid<VecDi, D>::index(a, phi.dims(), phi.offset());
const UINT bidx = Grid<VecDi, D>::index(b, phi.dims(), phi.offset());
return aidx < bidx;
});
aneighs.erase(std::unique(aneighs.begin(), aneighs.end()), aneighs.end());