我当前正在接收一些存储在
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
中的数据。
谢谢
这是不可能的
std::vector
。 A std::vector
拥有数据并进行独家管理。使用一些外部数据初始化它总是需要副本。
std::span
。input_data
: 初始化时不需要任何副本
std::span<std::uint8_t> sliced_data(input_data.begin() + header_len, len-header_len);