从另一个 std::vector 的连续子集创建 std::vector 的有效方法

问题描述 投票:0回答:1

我当前正在接收一些存储在

std::vector
中的数据,并且我正在寻找一种有效的方法来删除此向量中数据的前几个索引(其中包含一些标头信息)并存储其余数据在另一个向量中。换句话说,我的代码看起来像这样:

std::size_t len = 1000000000; //some big number
std::vector<std::uint8_t> input_data;
input_data.resize(len);

//the receive_data function takes a uint8_t pointer as input and writes in it len bytes of data
receive_data(input_data.data(), input_data.size()); 

std::size_t header_len=40;
std::vector<std::uint8_t> sliced_data;
sliced_data.resize(len-header_len);

//copy in a new vector all the data received, minus the header
std::copy(input_data.begin()+header_len, input_data.begin()+len, sliced_data.begin());

上述代码的问题在于,它执行了昂贵的内存复制,以便删除微小的标头并复制

sliced_data
中剩余的大块数据,这对我来说似乎不必要地慢。有没有办法创建新向量
sliced_data
,其中包含
input_data
中减去标题的所有数据? 有没有使用 C++17 的有效方法来做到这一点?例如 std::move 可以做到这一点吗? 我知道如果我处理 uint8_t 指针,这将是微不足道的,但在我的情况下,切片数据需要存储在一个新向量中,其中第一个索引指向
header_len
的索引
input_data
中的数据。

谢谢

c++ c++17
1个回答
0
投票

这是不可能的

std::vector
。 A
std::vector
拥有数据并进行独家管理。使用一些外部数据初始化它总是需要副本。

但是你可以使用一些非拥有的轻量级类,例如

std::span

input_data
:

初始化时不需要任何副本
std::span<std::uint8_t> sliced_data(input_data.begin() + header_len, len-header_len);
© www.soinside.com 2019 - 2024. All rights reserved.