我有一个
template<class Key, class Value, class Comp = std::less<Key> > class MyContainer;
使用内部节点树实现,其中每个节点类型定义如下:
typedef std::pair<Key, Value> Node;
要从容器中删除一个元素,我需要向用户提供以下方法:
void MyContainer::erase(const Key& k) {
const Node n(k, default_value); // default_value is a data member, copied from Value() by default in the constructor of MyContainer
//...
mytree->remove(n); // search and remove the Node in case
}
树使用(派生自的包装类)less<Key>
来比较和排序树中的元素。
正如您可能理解的那样,树中的remove()
方法实际上不需要访问该对中的第二个元素来查找节点。出于这个原因,我想避免default_value
副本到pair
的第二个元素的开销。
有没有办法摆脱这种不必要的开销?
编辑:树的类型为
template<class T, class Comp = std::less<T> > class Tree;
答案 0 :(得分:0)
我假设您使用defualt_value
作为accept anything
的某种占位符? (比如序言)
如果是这样,我会更改它,以便您在容器中搜索密钥,然后删除该元素。 (这可能是remove
的重载,或者只是一个查找,然后是显式节点删除。
你试图重新设置你的对,删除功能听起来像一个过于复杂的设计。
void MyContainer::erase(const Key& k) {
const Node n(k, default_value);
auto n=mytree->find(k);
mytree->remove_node(*n); //or whatever you syntax is
}
我假设因为您使用的模板和好的风格使您熟悉std::map
,std::multimap
以及无序的等值线。