2011-03-23 4 views
18

범위로는 한 쌍의 반복자를 의미합니다. 의사 C++에서 :C++에서 두 범위를 비교하는 표준 방법이 있습니까?

std::vector<int> v1 = { 1, 2, 3, 4, 5 }; 
std::vector<int> v2 = { 2, 3, 4 }; 
if(std::compare_range(v1.begin() + 1, v1.end() - 1, v2.begin(), v2.end()) { 
    std::cout << "Alright\n"; 
} 

compare_range 물론 나는 찾고있는 기능입니다.

면책 조항 : 이것은 작성하는 데 아주 사소한 기능입니다. 하지만 모든 프로그래머와 마찬가지로 나는 게으르려고 노력합니다 .-)

+3

어떻게 비교합니까? 평등을 위해서? 등가? 불평등? 더 높은? 보다 낮은? 더워? 추운가요? 무경험 직공? 블루 어? ... –

+1

@Tomalak Geret'kal : 당신은 "더 나은"것을 잊었습니다. – ereOn

+0

@ereOn : 그래서 : o) –

답변

26

std::equal은 찾고있는 함수 템플릿입니다. std::equal는 세 개의 인수가 아닌 네 소요

if (std::equal(v1.begin() + 1, v1.end() - 1, v2.begin()) 
{ 
    std::cout << "Alright\n"; 
} 

참고.

+0

어떻게 든 놓쳤습니다. 감사. 이제 생각해 봤지만 분명히 네 번째 인수가 필요하지 않습니다. :) –

+0

@Pedro : 글쎄, "안전"이유로 좋을 것입니다 .... –

+2

이 방법은 사용자가 , 두 간격은 같은 길이입니다. 그렇지 않으면 충돌하거나 잘못 작동 할 수 있습니다. –

7

std::equal을 사용하십시오. 범위도 지원합니다.

6

표준 "일 함수"방법이없는 것처럼 보입니다. 언급 된 std :: equal은 두 번째 범위가 첫 번째 범위보다 짧지 않다고 가정합니다. 예를 들어, 두 번째 간격이 비어 있으면 메모리가 손상 될 수 있습니다. 또한 두 번째 범위가 더 클 때 대답을주지 않습니다. STD의

조합 :: 같고 표준 : 거리가 필요하거나 자기 기록 기능이다 : 상기

template <class InputIterator1, class InputIterator2> 
bool safe_equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) 
{ 
    return (std::distance(first1, last1) == std::distance(first2, last2)) 
    && std::equal(first1, last1, first2); 
} 

기능이 아닌 임의 접근 반복자 두번 containter 통과하지만, 표준 기능을 사용 할 수있다. 허용되지 않는 경우 자체 구현을 작성하는 것이 합리적 일 수 있습니다.

+0

작은 구문 수정 : 마지막 인수는'second2' 대신'last2'라고해야하며'&&' 뒤에 첫 번째 여는 괄호는 중복됩니다. –

4

두 범위에 이 정확히 같은 수의 요소가 있다고 판단 할 수있는 수단이 있다면 std::equal이됩니다. 연습에서 이것은 종종 나를위한 경우 인 것 같지 않습니다. 그리고 내가 가지고있는 대부분의 용도는 std::equal입니다. 하나의 범위가 다른 하나의 접두사인지 여부를 결정하는 것은 실제로 입니다.

실제 비교를 위해 std::lexicographical_compare 이 더 유용하다고 알았지 만, 약속 할 수있는 관계는 이며 동등하지 않습니다. 등가성을 위해 을 두 번 적용 할 수 있습니다 (예 :

!lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()) 
&& !lexicographical_compare(b.begin(), b.end(), a.begin(), a.end()) 

하지만 두 요소를 비교이 거의 수단 ( 하지 않는 한 처음에 바로 차이가 있습니다).

관련 문제