我正在使用一个外部库,它在某些时候给了我一个指向整数数组和大小的原始指针。
现在我想使用 std::vector
来访问和修改这些值,而不是使用原始指针访问它们。
这是一个解释这一点的人工示例:
size_t size = 0;
int * data = get_data_from_library(size); // raw data from library {5,3,2,1,4}, size gets filled in
std::vector<int> v = ????; // pseudo vector to be used to access the raw data
std::sort(v.begin(), v.end()); // sort raw data in place
for (int i = 0; i < 5; i++)
{
std::cout << data[i] << "\n"; // display sorted raw data
}
预期输出:
1
2
3
4
5
原因是我需要在该数据上应用来自 <algorithm>
的算法(排序、交换元素等)。
另一方面,改变该向量的大小永远不会改变,因此 push_back
, erase
, insert
不需要在该向量上工作。
我可以根据库中的数据构造一个向量,使用修改该向量并将数据复制回库,但这将是我想避免的两个完整副本,因为数据集可能非常大。
原文由 Jabberwocky 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是
std::vector
必须从您初始化它的数组中复制元素,因为它拥有它包含的对象的所有权。为避免这种情况,您可以对数组使用 切片 对象(即,类似于
std::string_view
对std::string
的含义)。您可以编写自己的array_view
类模板实现,其实例是通过将原始指针指向数组的第一个元素和数组长度来构造的:array_view
不存储数组;它只保存一个指向数组开头的指针和该数组的长度。因此,array_view
对象的构造和复制成本很低。Since
array_view
provides thebegin()
andend()
member functions, you can use the standard library algorithms (eg,std::sort
,std::find
,std::lower_bound
等)就可以了:输出:
使用
std::span
(或gsl::span
)代替上面的实现暴露了 切片对象 背后的概念。但是,从 C++20 开始,您可以直接使用
std::span
代替。在任何情况下,您都可以使用gsl::span
从 C++14 开始。