gpt4 book ai didi

c++ - 将 std::vector 分配给 std::vector 而不复制内存

转载 作者:行者123 更新时间:2023-12-01 13:06:44 27 4
gpt4 key购买 nike

我有一个返回 std::vector<std::byte> 的函数
我知道 std::byte不是字符类型也不是整数类型,并且只能通过类型转换才能将其转换为 char。到现在为止还挺好。
所以我想(在我 知道 vector 只包含字符数据的情况下)从 std::vector<std::byte> 转移底层缓冲区的所有权到 std::vector<char>使用 std::move ,以避免复制整个底层缓冲区。
当我尝试这样做时,我收到此错误:

no suitable user-defined conversion from "std::vector<std::byte, std::allocatorstd::byte>" to "std::vector<char,std::allocator>" exists


这完全可能使用 C++ 吗?
我认为有真正的用例,人们会想要这样做

最佳答案

我可能会将数据保留在原始 vector<byte> 中并创建一个小类,保留对原始 vector<byte> 的引用并在您需要时进行必要的类型转换。
例子:

#include <cstddef>
#include <iostream>
#include <vector>

template<typename T>
struct char_view {
explicit char_view(std::vector<T>& bytes) : bv(bytes) {}

char_view(const char_view&) = default;
char_view(char_view&&) = delete;
char_view& operator=(const char_view&) = delete;
char_view& operator=(char_view&&) = delete;

// capacity
size_t element_count() const { return bv.size(); }
size_t size() const { return element_count() * sizeof(T); }

// direct access
auto data() const { return reinterpret_cast<const char*>(bv.data()); }
auto data() { return reinterpret_cast<char*>(bv.data()); }

// element access
char operator[](size_t idx) const { return data()[idx]; }
char& operator[](size_t idx) { return data()[idx]; }

// iterators - with possibility to iterate over individual T elements
using iterator = char*;
using const_iterator = const char*;

const_iterator cbegin(size_t elem = 0) const { return data() + elem * sizeof(T); }
const_iterator cend(size_t elem) const { return data() + (elem + 1) * sizeof(T); }
const_iterator cend() const { return data() + size(); }

const_iterator begin(size_t elem = 0) const { return cbegin(elem); }
const_iterator end(size_t elem) const { return cend(elem); }
const_iterator end() const { return cend(); }

iterator begin(size_t elem = 0) { return data() + elem * sizeof(T); }
iterator end(size_t elem) { return data() + (elem + 1) * sizeof(T); }
iterator end() { return data() + size(); }

private:
std::vector<T>& bv;
};

int main() {
using std::byte;

std::vector<byte> byte_vector{byte{'a'}, byte{'b'}, byte{'c'}};

char_view cv(byte_vector);

for(char& ch : cv) {
std::cout << ch << '\n';
}
}
输出:
a
b
c
如果您只需要 const,这是一个更简单的选择访问可以创建一个 string_view :
template<typename T>
std::string_view to_string_view(const std::vector<T>& v) {
return {reinterpret_cast<const char*>(v.data()), v.size() * sizeof(T)};
}
//...
auto strv = to_string_view(byte_vector);

关于c++ - 将 std::vector<std::byte> 分配给 std::vector<char> 而不复制内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62505019/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com