c++ - C++11 中的混合(List+Dict)容器

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

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

如果没有,障碍是什么?

请注意,我没有使用 stdlib 的经验,所以如果这是一个愚蠢的想法,我提前道歉。我想在下面展示我的场景,以便读者可以理解为什么我正在考虑这个替代方案:


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

在 Python 中,一切都是 PyObject,我有一个 Object 类包装了一个 PyObject*,它可以指向十几个中的任何一个Python 的内置类型( bool 、整数、浮点、unicode、字节、集合、列表、元组、字典、可调用、模块)。

我想在 C++ 中模仿 Python 的变色龙输入法。

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

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

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

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

等等

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

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

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

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

我能看到的直接障碍是:

// 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; 

看起来这些 typedef 需要存在才能让 stdlib 算法处理对象。但看起来我需要选择其中一套或另一套。 第四个例子,指针类型定义在这两种情况下都是不同的。

可能有什么解决方案?

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

这看起来可能比子类化更糟糕,但我想看看我拥有的所有选项。

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

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

(注意:顺便说一句,我已经破解了使用 A["key"] = B[42] 类型语法来处理序列类型对象和字典的问题。唯一明显的问题我面临的是,我想启用快速枚举:for(auto item:my_obj),但我还没有关注最终用途,我想抢占common使用场景)。

最佳答案

除非我遗漏了一些重要的东西,否则 Boost.Container 会提供一个 flat_map这基本上是一个建立在 vector 之上的 map 。

除非您已将普通 (unordered_) 映射确定为程序中的慢点,否则我会犹豫是否要离开它...

关于c++ - C++11 中的混合(List+Dict)容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726181/

相关文章:

c++ - 为什么静态大小的数组类型不能是容器类型?

c# - 以独立于语言的方式检索性能计数器值

c++ - 如何正确扩展 std::thread 以包装生成的线程

c++ - try and catch in C++ - 创建了多少个对象

c++ - std::map 的所有迭代器的模板特化

docker - 容器中的共享库

HTML 分区设置

c# - C++ 和 SharpZipLib

c++ - 按键的绝对值排序 std::map

c++ - 数组-遍历辅助数组