2016-08-07 6 views
0

Следующий код проверяет, являются ли все элементы в объявленном массиве нечетными числами.all_of функция проверки состояния во всех элементах части массива

#include "stdafx.h" 
#include <iostream>  // std::cout 
#include <algorithm> // std::all_of 
#include <array>  // std::array 

int main() { 
    std::array<int,8> foo = {3,5,7,11,13,17,19,23}; 

    if (std::all_of(foo.begin(), foo.end(), [](int i){return i%2;})) 
     std::cout << "All the elements are odd numbers.\n"; 

    return 0; 
} 

(Пример взят из http://www.cplusplus.com/reference/algorithm/all_of)

Я хотел бы проверить, если все элементы заявленного массива, начиная с foo[2] нечетные числа.

Замена foo.begin()foo[2] не работает. Я пробовал много других, чтобы сделать эту работу, все очень простые (очень простой пользователь C++ здесь), без успеха. Я не хочу изменять размер массива для достижения этого.

В конце концов, что я ищу оказываете цикл, в котором условие проверяется для каждого на элемент части массива, так же, как проверки for петли для условия на любой элемента части массив. Этого относительно легко достичь в R, и я надеюсь, что его можно так же легко достичь на C++.

+3

Замена 'foo.begin()' на 'foo.begin() + 2'? – DimChtz

+0

Спасибо. Это сработало! Провел весь день на этом. Приветствия. – Krug

+0

'foo.begin()' является 'итератором',' foo [2] 'является значением. – Jarod42

ответ

3

Вы не можете использовать итератор и элемент здесь, они не представляют диапазон. В более общем смысле даже попытка использовать указатель на элемент и итератор не будет хорошо определена для всех реализаций любого данного контейнера.

Вы должны использовать std::next(it.begin(), 2) для приращения итератора begin() к элементу foo[2], а затем вы можете перебирать диапазон с помощью двух итераторов.

std::all_of(std::next(foo.begin(), 2), foo.end(), 
    [](int i){/*...*/}) 

std::next() является более общим и обслуживает другие, чем просто случайные итераторы доступа (например, для альтернативного it.begin() + 2) итераторов; но будет по-прежнему работать над типом переданного ему итератора.

+0

Любые преимущества только от 'foo.begin() + 2'? – Krug

+1

Для итератора с произвольным доступом у вас есть, это будет одно и то же. Я предпочитаю использовать следующий для более надежного кода, если контейнер изменяется, а также другие изменения в обслуживании и т. Д. И некоторые личные предпочтения в отношении четкости кода при чтении кода. Оба будут работать так, как вы ожидаете. – Niall

+0

@Niall - с другой стороны, если контейнер переходит к типу, который не предоставляет итераторы произвольного доступа, 'std :: next' представит (потенциально большой) рейтинг производительности, тогда как' begin() + 2' won ' т компилировать. –

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