2015-02-26 2 views
3

У меня есть код C, который я хочу инкапсулировать на C++, чтобы упростить его использование.Преобразование C uint8_t указатель + комбинация размеров с итераторами C++

В коде C используется пара uint8_t*/size_t для ссылки на кусочек памяти. Могу ли я преобразовать их в итераторы C++ с чем-то вроде std::begin/std::end? Я знаю, что эти функции не принимают указатели, но, возможно, есть и другой способ. Я хочу избежать копирования любых данных.

Что я ищу что-то вроде этого:

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

Я также предпочитаю, чтобы избежать необходимости реализовывать свои собственные типы итераторов.

ответ

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

будет делать трюк
(итераторы фактически смоделированный указателей)

+0

Это то, что итераторы C++ (98) были предназначены для использования с использованием пары указателей. – dascandy

+1

Действительно ли они (конвертируемые в) итераторы C++? Я хочу передать их в библиотечные функции std, которые принимают только итераторы. – molf

+1

Функции библиотеки std разработаны с учетом этого, так что все алгоритмы могут использоваться вместе с массивами c-стиля тоже – sp2danny

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

Конечно, вы можете выбрать любой тип итера ator, что более подходит для функции.

1

Обычно вектор итераторы в основном псевдонимами указателей:

typedef value_type* iterator; 
typedef const value_type* const_iterator; 

Таким образом, вы можете просто написать:

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

Все операторы (++, *) будет работать таким же образом.

+0

Часто они завернуты, а в отлаге проверены. – Yakk

 Смежные вопросы

  • Нет связанных вопросов^_^