在这种情况下,如何优化一对的构造?

时间:2012-03-02 11:49:49

标签: c++

我有一个

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;

1 个答案:

答案 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::mapstd::multimap以及无序的等值线。