【问题标题】:Hybrid (List+Dict) container in C++11C++11 中的混合(List+Dict)容器
【发布时间】:2014-12-31 20:45:56
【问题描述】:

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

如果不是,障碍是什么?

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


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

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

我想模仿 Python 在 C++ 中的变色龙打字。

所以如果包装的 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 算法处理对象。但看起来我需要选择一组或另一组。 四个例子,这两种情况下的指针typedef是不同的。

可能有什么解决方案?

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

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

我还在想有没有什么方法可以不用提前指定。

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

(注意:顺便说一句,我已经解决了对序列类型对象和字典使用A["key"] = B[42]类型语法的问题。我面临的唯一明显问题是我想启用快速枚举:@ 987654331@,但我还没有专注于最终用途,我想先发制人的使用场景)。

【问题讨论】:

  • 您只需要能够提供beginend 函数,而您所需要的只是能够提供自定义迭代器。见:cs.northwestern.edu/~riesbeck/programming/c++/…
  • 您到底想做什么? Python 位与问题相关吗?
  • 我无法解析“C++ Python 包装器” - 哪种语言包装了哪个?
  • 如果我理解正确,您只需要一个始终排序的 std::vector,并使用 std::lower_bound 进行优化查找。还是我错过了什么?

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


【解决方案1】:

除非我遗漏了一些重要的东西,Boost.Container 提供了一个flat_map,它基本上是一个建立在矢量之上的地图。

除非您已将正常(无序_)地图确定为程序中的慢点,否则我会犹豫离开它...

【讨论】:

    猜你喜欢
    • 2017-05-09
    • 2014-07-19
    • 1970-01-01
    • 2011-04-01
    • 2012-11-30
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多