ArrayRef 的目的
Purpose of ArrayRef
我偶然发现了这个 http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html,我正试图了解它的用途。
我看不出 ArrayRef
解决了什么问题,有人可以解释一下这背后的动机吗?
这与 std::string_view
背后的想法相同:提供对某事物的一般看法,而不管理它的生命周期。
在ArrayRef
的情况下(这是一个糟糕的名字,恕我直言,ArrayView要好得多),它可以查看其他数组类型,包括非对象内置数组(C数组)。例如,您的函数可以如下所示:
size_t sum (ArrayRef<size_t> view){
return std::accumulate(view.begin(),view.end(),0);
}
并用 C 数组调用它:
size_t arr[] = {1,2,3,4,5,6,7};
auto _sum = sum(arr);
如果您将参数类型更改为 std::vector
,ArrayRef
仍然有效。
can you not just template an argument and have that accept any
different type of array of any length?
重点是您不必指向第一个元素,您可以指向 2 、3 或数组内的任何元素,所以基本上您建议的函数看起来像
template<class Array>
void doSomthing(Array& array , size_t pos, size_t length){/*...*/}
在这种情况下,使用 class 会更好(就像使用 std::string_view
而不是 const char*
+ size_t
一样)。
我偶然发现了这个 http://llvm.org/docs/doxygen/html/classllvm_1_1ArrayRef.html,我正试图了解它的用途。
我看不出 ArrayRef
解决了什么问题,有人可以解释一下这背后的动机吗?
这与 std::string_view
背后的想法相同:提供对某事物的一般看法,而不管理它的生命周期。
在ArrayRef
的情况下(这是一个糟糕的名字,恕我直言,ArrayView要好得多),它可以查看其他数组类型,包括非对象内置数组(C数组)。例如,您的函数可以如下所示:
size_t sum (ArrayRef<size_t> view){
return std::accumulate(view.begin(),view.end(),0);
}
并用 C 数组调用它:
size_t arr[] = {1,2,3,4,5,6,7};
auto _sum = sum(arr);
如果您将参数类型更改为 std::vector
,ArrayRef
仍然有效。
can you not just template an argument and have that accept any different type of array of any length?
重点是您不必指向第一个元素,您可以指向 2 、3 或数组内的任何元素,所以基本上您建议的函数看起来像
template<class Array>
void doSomthing(Array& array , size_t pos, size_t length){/*...*/}
在这种情况下,使用 class 会更好(就像使用 std::string_view
而不是 const char*
+ size_t
一样)。