我想以std风格实现自定义集合数据结构。这个网站上已经有一个similar question,但这个人明确询问不使用任何给定的std功能。
实现应与标准库的其余部分兼容,并提供相同的接口,例如迭代器和类型特征。我应该继承哪个基类以及我的类必须实现什么?
要提供有关实际数据结构的信息,它在内存中是hash map which values are stored continuously。在内部,我将使用两个std::vector
和一个std::unordered_map
。
答案 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的新内联版本控制功能: