指针算术与array_view
Pointer arithmetic with array_view
我刚刚看了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
。
相关文章:
- C++11 中不同类型的对象的 std::array 的替代方案
- constexpr begin of a std::array
- C++如果必须在编译时确定大小,std::array 有什么意义?
- OpenGL VBO Indexing ( How to compute Index Array)
- 标准::unordered_map 中的 std::array 的值初始化
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 确保编译时的特定 std::array 位置
- std::array的长度有大小限制吗?
- 将 std::array 移动到另一个 std::array
- 首先按给定顺序打印所有数字,然后使用 Array 打印所有字符和其他符号
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 将 **float array 从 C++ Dll 传递给 python
- std::bind on statd::array 的运算符 []
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何从未知视图中声明范围::v3::View 变量
- 我可以安全地复制矢量<array>吗?
- bsoncxx: document::view vs document::value
- 解析问题 - 预期的非限定 ID - #include <array> 编译错误
- 如何读/写或遍历 std::array 中的特定元素范围?
- 通过 host() 从 af::array 检索数据会导致错误的数据