2

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

想到的选项是:

  1. std::pair<unsigned>(或std::pair<size_t>)。
  2. 包装两个unsigneds(或size_t's)的结构。
  3. 滚动我自己的 Range 类,用实用方法对其进行修饰。

我尝试寻找合适的 Range 类,但找不到。标准库/STL 中没有任何内容使用范围类,这有点奇怪。

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

4

3 回答 3

2

这很难回答的主要原因是尚不清楚该范围将用于何种情况。甚至你可能还不知道确切的。

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

如果最后,当所有用例都明确了,所有的成员函数和辅助函数都定义好了,结果证明可以用pair替换,那么你仍然可以用a替换类typedef

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

于 2013-07-22T06:59:42.267 回答
0

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

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

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

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

现在,我想返回既是(某种程度上)标准的东西,又不会因为 vtables、复杂的 ctors 等而导致性能损失。

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

我尝试寻找合适的 Range 类,但找不到。标准库/STL 中没有任何内容使用范围类,这有点奇怪。

boost::range,如果你可以使用 boost。如果您不允许使用它,您可以自己滚动。我只会使用一对迭代器( :-> )

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

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

于 2013-07-22T08:25:06.317 回答
0

我个人会为该范围编写一个单独的类。由于没有虚拟调用,调用适当的方法几乎不会产生任何开销,并且您可以自由地为特定于范围的操作定义内部方法,例如联合、交集、移位、钳制等。

于 2013-07-22T06:57:43.747 回答