2016-04-12 2 views
1

Я хочу перебрать простой массив с использованием итераторов. Интересно, как я могу это сделать.Итерация по массиву с использованием итераторов

То, что я хотел бы иметь что-то вроде этого:

void foo(double* array, size_t size) 
{ 
    std::vector<double> real(size); 
    std::vector<double> imag(size); 
    auto arrBegin = std::begin(array); // this of course doesn't work 
    auto arrEnd = std::end(array); // this of course doesn't work 

    bool toggle = false; 

    std::partition_copy(arrBegin, arrEnd, std::begin(real), std::begin(imag), 
       [&toggle] (int) {return toggle != toggle}); 

    //Do other stuff 
} 

Как некоторые из вас могли бы догадаться, массив является чередованием комплексное число, что я хотел бы разделить на массивы действительных и мнимых часть.

Есть ли способ сделать это, используя массив, который я получаю в качестве указателя, если я знаю размер массива, или мне нужно использовать отдельный класс, такой как std :: vector для массива, чтобы работать с итераторами?

Я был бы признателен за использование std :: partition_copy(), но я открыт для других идей.

Примечание: Я не могу использовать std :: array, потому что размер массива неизвестен во время компиляции. std :: vector был бы возможен, но я действительно хочу посмотреть, можно ли это сделать без std :: vector, поскольку я получаю массив из API и хочу использовать его как есть.

+0

Вот почему вы должны использовать ['std :: array'] (http://en.cppreference.com/w/cpp/container/array). –

+0

Обратите внимание, что ваши векторы недостаточно велики, чтобы удерживать диапазоны выходных данных. –

+1

В случае несвязанной заметки, если у вас есть * размер * используйте 'size_t'. В 64-битной системе это, скорее всего, псевдоним 64-разрядного целочисленного типа без знака, как и 'uint64_t', но он передает более семантическую информацию читателю кода. –

ответ

2

Используйте array и array + size как ваши итераторы.

Возможно, вы также хотите использовать inserter-iterators для векторов.

#include <algorithm> 
#include <iterator> 

std::partition_copy(array, array + size, 
        std::back_inserter(real), 
        std::back_inserter(imag), 
        [&toggle](int t){ return t != toggle; }); 
+1

Этот ответ требует некоторых объяснений. Что вы делаете, это довольно продвинуто. – Chiel

+0

@Chiel: Какая часть этого неясна и не подпадает под соответствующую документацию? –

+0

Почему задние вкладыши? Почему модификация лямбда-функции? Ваше решение выглядит элегантно, если только я его понял. – Chiel

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