2017-11-23 2 views
0

여기에 설명 된 set_intersection STL 함수는 http://www.cplusplus.com/reference/algorithm/set_intersection/ 이 실제로 수학적으로 설정된 교차점이 아니라고 생각합니다. 예를 들어 줄을 바꾼다고 가정 해 보겠습니다.반복 된 값을 가진 Set_Intersection

int first[] = {5,10,15,20,20,25}; 
int second[] = {50,40,30,20,10,20}; 

결과적으로 10 20 20을 얻고 싶습니다. 그러나 나는 유일한 답을 얻습니다. STL에 진정한 교차로가 있습니까?

나는 병합과 set_differences의 결합으로 가능하다는 것을 알고있다. 내가 명백한 것을 놓치고 있는지 확인 만하면됩니다.

+0

이들은 세트가 아닙니다. 아마도 당신은 멀티 세트에 대해 생각하고있을 것입니다. – Beta

+0

예. 그것은 올바른 접근법처럼 보입니다. 이 대답에 나를 데려다 준다. 감사. https://stackoverflow.com/questions/41782233/i-want-to-perform-a-multi-set-intersection-using-c –

답변

1

그 결과로 10 20 20을 얻고 싶습니다. 그러나 나는 유일한 답을 얻습니다. STL에 진정한 교차로가 있습니까?

std::set_intersection 원하는대로 작동합니다.

코드를 제대로 업데이트하지 않았기 때문에 잘못된 대답을 얻게됩니다. 당신이 6 개 요소를 가지도록 설정을 변경하면 당신이 그들을 정렬하려면 라인을 업데이트해야합니다

std::sort (first,first+5); // should be first+6 
std::sort (second,second+5); // should be second+6 

또한 first+6second+6를 사용하는 set_intersection에 전화를 변경합니다. 그렇지 않으면 각 세트의 처음 5 개 요소 만 정렬하고 처음 5 개 요소의 교차점 만 가져옵니다.

분명히 입력에 반복 된 값을 포함시키지 않으면 결과가 출력에 포함되지 않습니다. 모든 입력 값을 포함하도록 코드를 올바르게 변경하면 원하는대로 작동합니다 (live example).

cplusplus.com은 http://en.cppreference.com/w/cpp/algorithm/set_intersection를 보면 당신은 명확하게 반복 요소의 작동 상태가 표시됩니다, 좋은 참고되지 않습니다 : 일부 요소에서 m 번 발견되면

를 [첫번째 1, last1) 및 [first2, last2]에서 n 번 누르면 첫 번째 std::min(m, n) 요소가 첫 번째 범위에서 대상 범위로 복사됩니다. cplusplus.com에서

심지어 예 ++가 관용적 현대 C로 작성된 경우는, 버그를 소개하는 간단하고, 더 열심히 것, 나쁜 :

#include <iostream>  // std::cout 
#include <algorithm> // std::set_intersection, std::sort 
#include <vector>  // std::vector 

int main() { 
    int first[] = {5,10,15,20,20,25}; 
    int second[] = {50,40,30,20,10,20}; 

    std::sort(std::begin(first), std::end(first)); 
    std::sort(std::begin(second), std::end(second)); 

    std::vector<int> v; 
    std::set_intersection(std::begin(first), std::end(first), 
         std::begin(second), std::end(second), 
         std::back_inserter(v));            

    std::cout << "The intersection has " << v.size() << " elements:\n"; 
    for (auto i : v) 
    std::cout << ' ' << i; 
    std::cout << '\n'; 
} 

이 자동으로 적절한 수를 처리 5 또는 6 또는 다른 마술 번호를 명시 적으로 말하지 않아도되며 출력 벡터에 초기 요소를 만든 다음 크기를 조정하여 다시 제거하지 않아도됩니다.

+0

감사합니다. 이것이 바로 문제입니다. 나는 지난 6 업데이트를 놓쳤다! –

+0

cplusplus.com 사용을 중단하면 잘못된 설명서와 나쁜 예가 있습니다 (개선 사항에 대한 답변을 참조하십시오). –

1

set_intersection 모두 범위를 정렬해야합니다. 귀하가 제공 한 데이터에서 second은 정렬되지 않았습니다.

먼저 정렬하는 경우 예상 답변을 받아야합니다.

+0

그래서 링크를 제공했습니다. 배열은 링크에 제공된 예제에서 정렬됩니다.그게 문제가 아니야 –

+1

@ WilmerE.Henao 질문에서 실행중인 코드를 제공하십시오. – 1201ProgramAlarm

관련 문제