【问题标题】:Storing elements in template container在模板容器中存储元素
【发布时间】:2012-09-28 03:33:46
【问题描述】:

我有一个模板类,我正在为一个行为有点像 C++ STL 中的容器类之一的项目工作,但我在找出一种好的安全方法来实现它时遇到了一些问题。

一些背景知识:我正在尝试将一个名为 Artemis 的现有项目(一个实体系统框架)从 Java 移植到 C++。有一个名为 bag 的类,它本质上是一个 ArrayList,但它包含的项目存储在数组中并使用索引查找以便更快地访问,存储的元素大部分存储自己的索引,但这并不重要。

问题:好的,所以我有一个包含 T 数组(模板类型)的模板类。我的问题是 T 元素的返回。在我的T &Get(int index) 函数中,我想返回对给定索引处元素的引用,但我不知道如果该元素不存在该怎么办。我想返回类似 null 的东西,但这不起作用,因为 T 的类型不能保证是指针。我可以让容器类包含T*s,但是我会遇到一些奇怪的问题/复杂的事情,比如 int 和非指针 (std::string) 以及一些超出范围的项目(除非我复制了值? )。

有没有人有任何想法或知道内置 STL 容器如何解决这些问题? 我希望我已经足够清楚我的要求......

链接:

我正在移植的文件

提前谢谢你。

【问题讨论】:

    标签: c++ templates stl containers


    【解决方案1】:

    当使用[] 语法时,标准关联容器(mapunordered_map 等)会创建一个默认构造的对象并返回对该对象的引用。

    您可以这样做,也可以在元素不存在时抛出异常。标准的关联容器有一个 at 函数可以做到这一点。

    另一种选择是拥有一个类似于标准容器的find 函数的函数,它返回一个迭代器 到元素,而不是对元素的引用。如果元素不存在,则返回的迭代器等于end(container)。这样您就可以在不使用异常的情况下实际检查元素是否存在。

    【讨论】:

    • 我正在考虑使用您提到的end 类型的东西,就像 find 函数一样,但是您能否详细说明[] 返回的默认构造对象?例如,如果索引无效,会发生什么?我发现的文档还说 []at 返回一个引用或一个 const_reference 但除了 T &const T & 的 typedef 之外,这些类型似乎没有什么特别之处。
    • @LucDanton 是的,这是真的,因为他正在制作一个类似map 的容器。我将对此添加注释。
    • @Roflha 当索引无效时,它使用该索引构造一个对象(即它“使索引有效”)并返回对它刚刚创建的那个对象的引用。 []at 相同,但at 会在索引不存在时抛出异常,而不是在该索引处静默创建对象。 find 是返回迭代器的那个。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多