繁体   English   中英

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

[英]How implement a custom std collection in C++?

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

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

为了提供有关实际数据结构的信息,它是一个哈希映射,其值连续存储在内存中。 在内部,我将使用两个std::vector和一个std::unordered_map

我应该从哪个基类继承

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

我班需要实施什么?

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

从类似于此的界面开始:

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的新内联版本控制功能:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM