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

时间:2015-02-26 12:29:58

标签: c++ c pointers c++11 iterator

我想要在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);

我也更愿意避免实现自己的迭代器类型。

3 个答案:

答案 0 :(得分:6)

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

会做到这一点 (迭代器实际上是在指针之后建模的)

答案 1 :(得分:1)

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

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 );

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

答案 2 :(得分:1)

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

typedef value_type* iterator;
typedef const value_type* const_iterator;

所以,你可以写:

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

所有操作符(++*)都将以相同的方式工作。