2015-11-18 2 views
1

Есть ли одно liner (или простое без петли) решение для деинтерлейции нечетных и четных элементов вектора?
Пример:Деинтерлейс нечетные и четные записи вектора C++

long entries[] = {0,1,2,3,4,5,6,7}; 
std::vector<long> vExample(entries, entries + sizeof(entries)/sizeof(long)); 

vExample.intertwine(vExample.begin(),vExample.end()); // magic one liner I wish existed... 

for (int i = 0; i < vExample.size(); i++) 
{ 
    std::cout << vExample[i] << " "; 
} 

Теперь я хотел бы иметь следующий вывод:

0 2 4 6 1 3 5 7 
+0

Это действительно не то, что я бы ожидать чего-то под названием 'переплетаются()', чтобы сделать ... С другой стороны, я не знаю лучшего названия , :) И почему бы просто не написать цикл и не вставить его внутри функции? – unwind

+0

Использование стабильного алгоритма сортировки с компаратором, выполняющим что-то вроде 'if (нечетного) возвращаемого значения; else возвращаемое значение * 100000000' –

ответ

8

Похоже, вы ищете std::partition или std::stable_partition, в зависимости от того, требуется ли порядок элементов сохранились:

#include <iostream> 
#include <algorithm> 
#include <vector> 

int main() { 
    std::vector<int> vals {0,1,2,3,4,5,6,7}; 
    std::stable_partition(begin(vals), end(vals), [](auto i){return !(i % 2);}); 
    for (auto v : vals) 
     std::cout << v << " "; 
} 

Выход: 0 2 4 6 1 3 5 7. См. Его live.

Разумеется, вы можете разделить любой другой критерий, изменив предикат.

+0

stable_partition действительно правильный ответ. – fjardon

+0

Почему он работает с примером вектора, но не с, например, {0,1,2,10,11}? В этом случае я ожидал бы {0,2,11,1,10}, но получаю {0,2,10,1,11}. – dangom

+0

@dpgomez Я не совсем понимаю ваш новый пример. Когда я понял ваш вопрос, вы хотите поместить все четные числа спереди и все нечетные числа в спину, что и происходит. Если это не то, что вы хотите, уточните вопрос. –

3
std::partition(std::begin(vExample), std::end(vExample), [](long l) { return !(l%2); }); 

Конечно, partition имеет цикл (ы) в нем.

http://en.cppreference.com/w/cpp/algorithm/partition

+1

Я писал ответ, используя цикл 'for', а также перемещаю элементы после просмотра их индексов, но это берет торт. Каждый узнает что-то повседневное. :) – therainmaker

+0

caveat: 'Относительный порядок элементов не сохраняется.'. Похоже, что OP хочет сохранить этот порядок. – fjardon

0
for(int i = 0; i < vExample.size() * 2; i += 2) { 
    auto value = vExample[i%vExample.size()]; 
    //Do whatever you want with value, print it out, etc. 
    if(i == vExample.size() - 2) i++; 
} 
+1

Объяснение кода всегда хорошее. –

0

Вы можете использовать стандартный алгоритм std::stable_partition заявленных в заголовке <algorithm>. Например

#include <algorithm> 

//... 

long entries[] = {0,1,2,3,4,5,6,7}; 
std::vector<long> vExample(entries, entries + sizeof(entries)/sizeof(long)); 

std::stable_partition(vExample.begin(), vExample.end(), [](long x) { return x % 2 == 0; }); 

for (long x : vExample) std::cout << x << ' '; 
std::cout << std::endl; 

Выход

0 2 4 6 1 3 5 7 
Смежные вопросы