我可以创建一个没有底层容器对象的空范围(迭代器对)吗?

时间:2015-03-31 09:45:26

标签: c++ c++11 boost

我有一个类似于以下的类:

struct Config
{
   using BindingContainer = std::map<ID, std::vector<Binding>>;
   using BindingIterator  = BindingContainer::mapped_type::const_iterator;

   boost::iterator_range<BindingIterator> bindings(ID id) const;
private:
   BindingContainer m_bindings;
};

由于传递给ID的{​​{1}}可能不存在,我需要能够在返回类型域中表示“无绑定”值。

我不需要将未知的bindings()与映射到空ID的{​​{1}}区分开来,所以我希望能够通过上面的界面来实现这一点,使用默认构造的迭代器返回空范围。不幸的是,尽管IDvector [C ++ 11 24.2.5 / 1],比较单个迭代器的结果是未定义的[24.2.1 / 5],所以没有容器似乎这个是不可能的。

我可以更改界面,例如将ForwardIterator包裹在DefaultConstructible中,或者返回矢量值;虽然前者对调用者来说更笨拙,但后者有不合需要的复制开销。

另一种选择是保持静态分配的空向量并返回其迭代器。在这种情况下,开销不会有问题,但如果可以,我想避免它。

调整iterator_range迭代器以产生可比较的默认构造迭代器是可能的,虽然看起来过于复杂......

这里是否有任何其他选项可以支持在没有底层容器时返回空范围?

(顺便提一下,我肯定有一段时间我读了一篇关于在没有容器对象时生成标准容器类型的空范围的工作文章或文章,但现在找不到任何东西。)

(注意我仅限于C ++ 11的功能,但是如果有任何不同的方法需要以后的功能,我会感兴趣。)

2 个答案:

答案 0 :(得分:2)

不,没有。您的选择是按照您的建议。就个人而言,我可能会想到从静态空向量中劫持迭代器对;我无法想象什么是名义上的&#34;开销&#34;这将涉及到您的过程映像中的几个额外字节。

这在C ++ 14或C ++ 17中都没有改变(到目前为止)。

答案 1 :(得分:0)

您可以使用默认构造的boost::iterator_range

来自(https://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/utilities/iterator_range.html):

  

但是,如果创建一个默认构造的iterator_range,那么一个   仍可以调用其所有成员函数。该设计决策避免了   iterator_range对迭代器的范围施加了限制   不是单数。

此处的示例: https://wandbox.org/permlink/zslaPwmk3lBI4Q9N