指针算术与array_view

Pointer arithmetic with array_view

本文关键字:view array 指针      更新时间:2023-10-16

我刚刚看了Herb Sutter的"Writing Good c++ 14…"(https://www.youtube.com/watch?v=hEx5DNLWGgA)和我有一个(可能愚蠢的)问题关于array_view。

给出的情况是发送一个array_view而不是一个指针和长度,以避免指针算术,但是array_view如何处理这样的情况:

int vec[10];
func(vec+2, 5); //start from the 2nd element and process 5 of them

是否array_view支持这种东西或我只是得到了错误的用例?

首先,你可以从cppcon的Github repo中获取幻灯片。

正如您在#8#10中看到的那样,您可以编写以下内容:

Run It Online

// http://llvm.org/apt/
// sudo apt-get install clang-3.6 lldb-3.6 libc++-dev libc++abi-dev
// clang-3.6 -stdlib=libc++ -std=c++14 main.cpp -lc++ -lc++abi
#include <array>
#include <vector>
#include "array_view.h"  // https://github.com/Microsoft/GSL
void func(gsl::array_view<int> av)
{
    // ...
}
int main()
{
    {
        int vec[10];
        func(vec);
        //func(vec, 5);    // syntax error (func expects exactly 1 argument)
        func({vec, 5});    // notice the curly braces
        func({vec+2, 5});
    }
    {
        std::vector<int> vec;
        func(vec);
    }
    {
        size_t len = 10;
        int* p = new int[10];
        func({p,len});
        // remember to delete[] p
    }
    {
        std::array<int, 2> arr;
        func(arr);
    }
}

这是有道理的。如果你查看array_view.h,你会看到array_view的所有构造函数:

constexpr array_view(pointer ptr, bounds_type bounds)
constexpr array_view(T * const & data, size_type size)
constexpr array_view(T(&arr)[N], size_type size)
constexpr array_view (const std::array<std::remove_const_t<value_type>, N> & arr)
// ...

对于string_view,您可以这样做:

const char* str = "hello world!"; 
func(std::experimental::string_view(str + 2, 5));

即使用视图的一个构造函数从子字符串构建视图。

所以使用array_view,你可能会这样做:
int vec[10];
func(std::experimental::array_view(vec + 2, 5));

注意: c++14似乎没有任何官方的array_view