C ++ 11中的Hybrid(List + Dict)容器

时间:2014-12-31 20:45:56

标签: c++ c++11 containers std hybrid

是否可以在同一个类中提供std :: map和std :: vector功能?

如果没有,障碍是什么?

请注意,我没有使用stdlib的经验,所以如果这是一个甚至考虑的愚蠢想法,我提前道歉。我想在下面介绍我的方案,以便读者可以看出为什么我在考虑这个替代方案:


我正处于围绕Python运行时重写C ++包装器的最后阶段。我的想法是我的C ++项目能够执行Python脚本。

在Python中,一切都是PyObject,我有一个包含Object的{​​{1}}类,它可以指向Python的内置类型中的任何一个(布尔值) ,整数,浮点,unicode,字节,集合,列表,元组,字典,可调用,模块)。

我想反映Python在C ++中输入的变色龙。

因此,如果包装的PyObject是{set,list,bytes,unicode,tuple},这些都是序列,所以我希望能够做到这样的事情:

PyObject*

如果是字典,我可以这样做:

cout << my_seq[3]
my_seq[4] = foo
for( auto item : my_seq ) {...}

原始项目有一个SeqBase类,其中包含用于快速枚举的必要stdlib容器机制等.start,end,iterator,const_iterator等。以及{set,list,bytes,unicode,tuple}派生自此。代码here

它还有一个MapBase类,它包含不同的begin,end,iterator,const_iterator等。代码here

我想将这两个容器合并,以便仍然可以从一个Object类处理所有内容。

但我完全不确定是否有可能。

我能看到的一个直接障碍是:

my_dict["someKey"] = someValue;
for( auto kv_pair : my_seq ) {...}

看起来这些typedef需要存在才能使stdlib算法处理对象。但看起来我需要选择一套或另一套。 举个例子,指针typedef在这两种情况下都不同。

可能有哪些解决方案?

也许我可以模板化Object,并使用元编程来允许Object和Object,也许可以使用SFINAE来切换相关的迭代器。

这看起来可能比继承更糟糕,但我希望看到我拥有的所有选项。

我仍然想知道是否有某种方法可以做到而无需提前指定。

我并不担心产生可能被滥用的代码,消费者有责任不在列表上做字典等事情。

(注意:除此之外,我已经解决了使用// SeqBase typedef size_t size_type; typedef seqref<T> reference; typedef T const_reference; typedef seqref<T> *pointer; typedef int difference_type; typedef T value_type; // TMM: 26Jun'01 // MapBase typedef size_t size_type; typedef Object key_type; typedef mapref<T> data_type; typedef std::pair< const T, T > value_type; typedef std::pair< const T, mapref<T> > reference; typedef const std::pair< const T, const T > const_reference; typedef std::pair< const T, mapref<T> > pointer; 类型语法处理序列类型对象和词典的问题。我面临的唯一明显问题是我想要启用快速枚举:A["key"] = B[42],但我还没有专注于最终用途,我想先预先考虑常见的使用方案。)

1 个答案:

答案 0 :(得分:1)

除非我遗漏了一些至关重要的内容,否则Boost.Container会提供一个flat_map,它基本上是一个构建在矢量之上的地图。

除非你已经将普通(无序)地图确定为程序中的慢点,否则我会毫不犹豫地离开它...