(数组索引的)范围应该使用什么类型
What type should I use for a range (of array indices)?
我需要编写一些函数,返回数组中的范围(如果愿意,可以假设它们被指定为起始位置和长度)。我不能返回元组,所以我需要返回一些其他类型(也许这是个好主意)。现在,我想返回一些(在某种程度上)标准的东西,并且不会因为vtables、complexed ctors等而导致性能损失。
脑海中浮现的选项是:
std::pair<unsigned>
(或std::pair<size_t>
)- 包装两个
unsigned
(或size_t
)的结构 - 滚动我自己的Range类,用实用方法对其进行糖衣处理
我试着找一个合适的Range类,但找不到。奇怪的是,标准库/STL中没有任何一个类用于范围。
有更好的选择吗?如果没有,你会推荐上面哪一个?
这很难回答的主要原因是不清楚在什么情况下会使用范围。甚至你可能还不清楚。
在这种情况下,我建议创建自己的类,因为这样可以保持灵活性。您可以根据需要添加成员函数和嵌套的typedef。
如果最终,当所有用例都清楚了,并且定义了所有成员函数和辅助函数时,它可以用一对来替换,那么你仍然可以用typedef
来替换这个类。
对于内部类型,我建议迭代器而不是整数,除非你想存储大量的这些范围(在这种情况下,空间优化很重要,两个整数(偏移量+长度)有助于节省空间)。
就我个人而言,我会为该范围编写一个单独的类。如果没有虚拟调用,那么调用适当的方法几乎就没有开销,并且您可以自由地为范围特定的操作定义内部方法,如并集、交集、移位、箝位等。
我需要编写一些函数来返回数组中的范围(如果您愿意,可以假设它们被指定为起始位置和长度)。
这听起来像是需要对一对迭代器进行分组。
我不能返回元组,所以我需要返回一些其他类型(也许这是个好主意)。
不知道为什么不能返回元组,但可以尝试返回一对迭代器,或者(如果不能返回std::pair
)围绕一对迭代器创建自己的结构。
现在,我想返回一些(在某种程度上)标准的东西,并且不会因为vtables、complexed ctors等而导致性能损失。
一对迭代器听起来不错:)(我听起来像一张破唱片)
我试着找一个合适的Range类,但找不到。奇怪的是,标准库/STL中没有任何一个类用于范围。
如果你能使用boost,就有boost::range。如果不允许你使用它,你可以自己滚动。我只需要使用一对迭代器(:->)
[…]还有更好的选择吗?如果没有,你会推荐上面哪一个?
是的:使用一对迭代器:它是标准兼容的,速度快,惯用,不受复杂构造或vtables开销的影响,而且是安全的。它也遵循了最小惊喜的原则。
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 这是什么类型的C++语法,我应该采取什么步骤来理解这一点
- 当你只使用 return 时,函数返回什么类型;在 c++ 中
- 这在C++是什么类型的错误?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- int(int)& 或 int(int) const &是什么类型?
- 它>首先给出什么类型?
- ``n = 1u;'有什么类型
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 二进制要找到什么类型的序列化
- 我如何找出3D容器的元素是什么类型
- C++ - 函数中的局部指针变量具有什么类型的存储持续时间以及它们存储在哪里?
- 将 lambda 作为模板参数传递:实际推导出什么类型
- 在 c 和 c++ 中,二维数组的元素是什么类型?
- 什么类型会使"std::has_unique_object_representations"返回 false?
- 这个 lambda 的参数是什么类型?
- 转换逻辑目标是什么类型
- 由值持有的成员的get函数应该具有什么类型
- C++中使用什么类型来定义数组大小