将 C uint8_t 指针 + 大小组合转换为 C++ 迭代器

Converting C uint8_t pointer + size combination to C++ iterators

我有一些 C 代码想封装在 C++ 中以使其更易于使用。

C 代码使用 uint8_t*/size_t 对来引用一块内存。我可以用 std::begin/std::end 之类的东西将它们转换为 C++ 迭代器吗?我知道这些函数不接受指针,但也许还有其他方法。我想避免必须复制任何数据。

我要找的是这样的:

void fn(uint8_t* ptr, size_t size) {
    auto begin = std::begin(...);
    auto end = std::end(...);

    // continue to use begin/end similar to std::vector<uint8_t>::iterator
}

迭代器应该可以与标准库一起使用。具体来说,我想将它与 std::copy 和采用迭代器的 std::vector 构造函数一起使用。我知道我有其他选项来复制内存,但我正在寻找 C++ 类型的封装。

我也试过这个,但显然这是一个私有构造函数。 (对我来说,我无法构建向量迭代器是完全合理的,但我只是在尝试。)

std::vector<uint8_t>::iterator begin(ptr);

我也希望避免必须实现我自己的迭代器类型。

auto begin = ptr;
auto end = ptr+size;

会成功的
(迭代器实际上是根据指针建模的)

您可以简单地定义函数,例如:)

template <class RandomAccessIterator>
void fn( RandomAccessIterator begin, RandomAccessIterator end ) {

    // continue to use begin/end similar to std::vector<uint8_t>::iterator
}

并这样称呼它

fn( ptr, ptr + size );

当然,您可以选择更适合该函数的任何一种迭代器。

通常,向量迭代器基本上是指针的别名:

typedef value_type* iterator;
typedef const value_type* const_iterator;

所以,你可以这样写:

uint8_t* begin = ptr;
uint8_t* end = ptr + size;

所有运算符(++*)的工作方式相同。