如何在C ++中实现自定义std集合?

时间:2014-03-10 11:52:25

标签: c++ collections interface stl iterator

我想以std风格实现自定义集合数据结构。这个网站上已经有一个similar question,但这个人明确询问不使用任何给定的std功能。

实现应与标准库的其余部分兼容,并提供相同的接口,例如迭代器和类型特征。我应该继承哪个基类以及我的类必须实现什么?

要提供有关实际数据结构的信息,它在内存中是hash map which values are stored continuously。在内部,我将使用两个std::vector和一个std::unordered_map

2 个答案:

答案 0 :(得分:2)

  

我应该从

继承哪个基类

无。标准容器不是多态的;他们的接口要求是根据必须支持的表达式非正式地指定的。 (将来,它们可能被正式指定为“概念”;但这还不是语言的一部分。)

  

我班需要实施什么?

参见C ++标准的[container.requirements]部分(目前是C ++ 11的第23.2节);特别是指定各种容器类型必须支持的操作的表。作为哈希映射,它应该支持“无序关联容器”的要求。

答案 1 :(得分:1)

从类似于此的界面开始:

template <
    typename Key,
    typename T,
    class Hash = hash<Key>,
    class Pred = equal_to<Key>,
    class AllocH = allocator< pair<const Key,T> >,  // unordered_map allocator
    class AllocV = allocator<T> > // vector allocator
class hash_map {
public:
  typedef std::pair<Key, T> value_type;

private:
  using first_index = std::vector<T>; // C++11 typedef substitute syntax
  using second_index = std::unordered_map<Key, T>;

public:          
  using first_index_iterator = typename first_index::iterator;
  using second_index_iterator = typename second_index::iterator;      
  //defaults
  using iterator = first_index_iterator;
  using const_iterator = first_index_const_iterator;

  iterator begin();
  const_iterator begin() const;

  iterator end();
  const_iterator end() const;

  bool empty() const;

  iterator find(const Key&);
  const_iterator find(const Key&) const;

  std::pair<iterator, bool> insert(const value_type&);
  void erase(iterator);  
  void clear();    
};

您不应该将您的集合添加到 std 命名空间,但是如果继续,我强烈建议您在发布库标题时使用命名空间版本控制:

// hash_map.hpp
namespace std 
{
  namespace ex_v1  // my std namespace extensions v1
  {
      template <...> class hash_map { ... }    
  }

  using namespace ex_v1;
}

此外,请考虑C ++ 11的新内联版本控制功能: