2016-08-07 2 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]부터 경우 I을 확인하고자

는 홀수이다.

foo.begin()foo[2]으로 바꾸는 기능이 작동하지 않습니다. 나는이 작업을 만들기 위해 다른 많은 것들을 시도했다. 아주 기본적인 (아주 기본적인 C++ 사용자이다.) 성공하지 못했다. 나는 이것을 달성하기 위해 배열의 크기를 조정하고 싶지 않다.

궁극적으로 내가 그냥 의 일부의 요소에 조건에 대한 for 루프 검사 등의 조건이 배열의 일부를 의 모든 요소에 대한 체크 루프를 데를 찾고 있어요 정렬. 이것은 R에서 비교적 쉽게 구현할 수 있으며, C++에서 달성하기가 쉽습니다.

+3

'foo.begin()'을'foo.begin() + 2'으로 바꾸시겠습니까? – DimChtz

+0

감사합니다. 그게 효과가 있었어! 이것에 하루 종일 보냈습니다. 건배. – Krug

+0

'foo.begin()'은 iterator이고, foo [2]는 값입니다. – Jarod42

답변

3

여기에서 반복기와 요소를 사용할 수 없으며 범위를 나타내지 않습니다. 좀 더 일반적인 의미에서 엘리먼트와 반복자에 대한 포인터를 사용하려고 시도해도 주어진 컨테이너의 모든 구현물에 대해 잘 정의되지는 않습니다.

begin() 반복자를 foo[2] 요소로 증가시키고 두 반복자를 사용하여 범위를 반복 할 수 있습니다.

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

std::next() 더 일반적이며 (예컨대 대체 it.begin() + 2위한) 단지 임의 접근 반복자 이외 반복자 충족시켜; 그러나 그것으로 전달 된 iterator의 타입에 대해서 여전히 실행 가능할 것입니다.

+0

'foo.begin() + 2'에 대한 이점은 무엇입니까? – Krug

+1

당신이 가진 랜덤 억세스 반복자에 대해서는 똑같은 것이 될 것입니다. 나는 콘테이너가 바뀌면 더 강건한 코드를 위해 다음의 사용을 선호한다. 그리고 다른 유지 보수 변경들과 코드 읽기에서의 코드 명료성에 대한 개인적인 선호도를 선호한다. 둘 다 예상대로 작동합니다. – Niall

+0

@Niall - 반면에 컨테이너가 랜덤 액세스 반복자를 제공하지 않는 유형으로 변경되면'std :: next'는 (잠재적으로 큰) 성능 히트를 가져오고'begin() + 2'는 ' t 컴파일. –

관련 문제