是否可以在同一个类中提供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]
,但我还没有专注于最终用途,我想先预先考虑常见的使用方案。)
答案 0 :(得分:1)
除非我遗漏了一些至关重要的内容,否则Boost.Container会提供一个flat_map,它基本上是一个构建在矢量之上的地图。
除非你已经将普通(无序)地图确定为程序中的慢点,否则我会毫不犹豫地离开它...