我想要在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);
我也更愿意避免实现自己的迭代器类型。
答案 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;
所有操作符(++
,*
)都将以相同的方式工作。