В этой функции пересечения я создал новый объект, чтобы избежать использования карты::erase() в качестве небольшой оптимизации, поскольку стирание просто сделает недействительными итераторы в карте и ссылках, но распределение памяти останется прежним. После этого я в основном делаю несколько копий объекта GenericCollection и хочу избежать повторного копирования всего блока памяти.
Код: Выделить всё
class GenericCollection {
private:
std::unordered_map data_;
public:
// ... add, remove member functions
bool contains(const CollectionTypeObj& key) {
return data_.contains(key);
}
GenericCollection& intersect(const GenericCollection& rhs) {
std::unordered_map intersection;
for (auto it = data_.begin(); it != data_.end(); ++it) {
if (rhs.contains(it->first)) {
intersection[it->first] = it->second;
}
}
data_ = std::move(intersection);
return *this;
}
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... emory-leak
Мобильная версия