我应该在一个范围(数组索引)中使用什么类型?

时间:2013-07-22 06:51:53

标签: c++ coding-style range c++-standard-library

我需要编写一些函数来返回数组中的范围(如果您愿意,可以假设它们被指定为起始位置和长度)。我不能返回一个元组,所以我需要返回一些其他类型(也许这是一个好主意)。现在,我想返回一些既有(有些)标准的东西,也不会因vtable,复杂的ctors等而导致性能下降。

想到的选项是:

  1. std::pair<unsigned>(或std::pair<size_t>)。
  2. 包含两个unsigned s(或size_t)的结构。
  3. 滚动我自己的Range类,用实用方法对其进行糖衣涂装。
  4. 我尝试寻找合适的Range类,但找不到。有点奇怪的是,标准库/ STL中没有任何东西用于范围。

    有更好的选择吗?如果没有,你会推荐以上哪一项?

3 个答案:

答案 0 :(得分:2)

难以回答的主要原因是,不清楚该范围将被用于何种情况。即便你可能还不确切知道。

在这种情况下,我建议您创建自己的类,因为这可以让您保持灵活性。您可以根据需要添加成员函数和嵌套的typedef。

如果最后,当所有用例都清楚并且已经定义了所有成员函数和辅助函数时,事实证明它可以替换为一对,那么你仍然可以用{{1}替换该类}。

对于内部类型,我建议使用整数迭代器,除非你想存储大量的这些范围(在这种情况下,空间优化很重要,两个整数(偏移+长度)将有助于节省空间)。

答案 1 :(得分:0)

就个人而言,我会为该范围编写一个单独的类。在没有虚拟调用的情况下,调用适当的方法几乎没有任何开销,您可以自由地定义范围特定操作的内部方法,例如union,intersection,shift,clamp等。

答案 2 :(得分:0)

  

我需要编写一些函数来返回数组中的范围(如果你愿意,可以假设它们被指定为起始位置和长度)。

听起来你需要对一对迭代器进行分组。

  

我无法返回一个元组,所以我需要返回其他类型(也许这可能是一个好主意)。

不确定为什么你不能返回一个元组,但你可以尝试返回一对迭代器,或者(如果你不能返回std::pair)在一对迭代器周围创建自己的结构。

  

现在,我想返回一些既有(有些)标准的东西,也不会因vtable,复杂的ctors等而导致性能下降。

一对迭代器听起来不错:) (我听起来像是破纪录)

  

我尝试寻找合适的Range类,但找不到。有点奇怪的是,标准库/ STL中没有任何东西用于范围。

如果您可以使用提升,则有boost::range。如果您不允许使用它,您可以自己动手。我只想使用一对迭代器(: - &gt;)

  

[...]有更好的选择吗?如果没有,你会推荐以上哪一项?

是的:使用一对迭代器:它是标准兼容的,它很快,它是惯用的,它不会受到复杂的构造或vtables开销的影响而且它是安全的。它也遵循最不突然的原则。