array_view 的指针运算
Pointer arithmetic with array_view
我刚刚看过 Herb Sutter 的 "Writing Good C++14... By Default" (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 支持这种东西还是我只是弄错了用例?
使用 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
。
首先可以得到the slides from cppcon's Github repo.
正如你在#8
和#10
中看到的那样,你可以这样写:
// 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)
// ...
我刚刚看过 Herb Sutter 的 "Writing Good C++14... By Default" (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 支持这种东西还是我只是弄错了用例?
使用 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
。
首先可以得到the slides from cppcon's Github repo.
正如你在#8
和#10
中看到的那样,你可以这样写:
// 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)
// ...