| 174 | } |
| 175 | |
| 176 | void |
| 177 | NeighborhoodSearch::erase_empty_entries(std::vector<unsigned int> const& to_delete) |
| 178 | { |
| 179 | if (to_delete.empty()) |
| 180 | return; |
| 181 | |
| 182 | // Indicated empty cells. |
| 183 | m_entries.erase(std::remove_if(m_entries.begin(), m_entries.end(), [](HashEntry const& entry) |
| 184 | { |
| 185 | return entry.indices.empty(); |
| 186 | }), m_entries.end()); |
| 187 | |
| 188 | { |
| 189 | auto it = m_map.begin(); |
| 190 | while (it != m_map.end()) |
| 191 | { |
| 192 | auto& kvp = *it; |
| 193 | |
| 194 | if (kvp.second <= to_delete.front() && kvp.second >= to_delete.back() && |
| 195 | std::binary_search(to_delete.rbegin(), to_delete.rend(), kvp.second)) |
| 196 | { |
| 197 | it = m_map.erase(it); |
| 198 | } |
| 199 | else |
| 200 | { |
| 201 | ++it; |
| 202 | } |
| 203 | } |
| 204 | } |
| 205 | |
| 206 | std::vector<std::pair<HashKey const, unsigned int>*> kvps(m_map.size()); |
| 207 | std::transform(m_map.begin(), m_map.end(), kvps.begin(), |
| 208 | [](std::pair<HashKey const, unsigned int>& kvp) |
| 209 | { |
| 210 | return &kvp; |
| 211 | }); |
| 212 | |
| 213 | // Perform neighborhood search. |
| 214 | #ifdef _MSC_VER |
| 215 | concurrency::parallel_for_each |
| 216 | #else |
| 217 | __gnu_parallel::for_each |
| 218 | #endif |
| 219 | (kvps.begin(), kvps.end(), [&](std::pair<HashKey const, unsigned int>* kvp_) |
| 220 | { |
| 221 | auto& kvp = *kvp_; |
| 222 | |
| 223 | for (unsigned int i = 0; i < to_delete.size(); ++i) |
| 224 | { |
| 225 | if (kvp.second >= to_delete[i]) |
| 226 | { |
| 227 | kvp.second -= static_cast<unsigned int>(to_delete.size() - i); |
| 228 | break; |
| 229 | } |
| 230 | } |
| 231 | }); |
| 232 | } |
| 233 | |