그 결과로 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+6
및 second+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
또는 다른 마술 번호를 명시 적으로 말하지 않아도되며 출력 벡터에 초기 요소를 만든 다음 크기를 조정하여 다시 제거하지 않아도됩니다.
이들은 세트가 아닙니다. 아마도 당신은 멀티 세트에 대해 생각하고있을 것입니다. – Beta
예. 그것은 올바른 접근법처럼 보입니다. 이 대답에 나를 데려다 준다. 감사. https://stackoverflow.com/questions/41782233/i-want-to-perform-a-multi-set-intersection-using-c –