3

我创建了这个模板函数来从 shared_ptr 集合中查找和删除项目

template<class T>
bool FindAndDelete(set<shared_ptr<T>>& collection, shared_ptr<T> item)
{
    auto foundItem = find(collection.begin(), collection.end(), item);
    if(foundItem != collection.end())
    {
        collection.erase(foundItem);
        return true;
    }
    else
    {
        return false;
    }
}

问题:我怎样才能更概括它以涵盖所有集合?(矢量、列表等...)

例如

template<class K, class T>
bool FindAndDelete(K<shared_ptr<T>>& collection, shared_ptr<T> item);

注意:我来自 C#,所以可能代码有点不对:) 请纠正我

4

2 回答 2

6

如果你想从容器中删除元素,那么这样的事情会起作用:

template<class K>
bool FindAndDelete(K& collection, typename K::value_type item);

请记住,value_type地图的 是std::pair<key_type, mapped_type>,因此您可能需要为这些地图提供特殊版本,例如

template<typename T, typename K>
bool FindAndDelete(std::map<T,K>K& collection, 
                   typename std::map::<T,K>::key_type key);

同样适用于std::multimapC++11std::unordered_*变体。这些容器具有find比 更有效的成员函数std::find,因此值得有专门的实现findAndDelete来利用这一点。

您还可以查看std::remove_if擦除删除习惯用法作为非关联容器实现的替代方法。在您有重复的情况下,这可能会更有效。

于 2012-11-26T09:00:51.077 回答
1
template <template<typename> class K, typename T>
bool FindAndDelete(K<shared_ptr<T> > &collection, shared_ptr<T> item);
于 2012-11-26T09:00:02.510 回答