programing

std :: multiset에는 요소가 발견되면 하나의 샘플 (단일화 또는 복제) 만 지우는 함수 또는 알고리즘이 있습니다.

nasanasas 2020. 12. 13. 09:43
반응형

std :: multiset에는 요소가 발견되면 하나의 샘플 (단일화 또는 복제) 만 지우는 함수 또는 알고리즘이 있습니다.


아마도 이것은 중복이지만 검색하는 것을 찾지 못했습니다 . 발견 된 값을 가진 모든 요소 erase(value)std::multiset대해 호출 되면 삭제됩니다. 내가 생각할 수있는 유일한 해결책은 다음과 같습니다.

std::multiset<int>::iterator hit(mySet.find(5));
if (hit!= mySet.end()) mySet.erase(hit);

이것은 괜찮지 만 더 나을 것이라고 생각했습니다. 어떤 아이디어?


auto itr = my_multiset.find(value);
if(itr!=my_multiset.end()){
    my_multiset.erase(itr);
}

나는 똑같은 것을 달성하는 더 깨끗한 방법이 있다고 상상할 것입니다. 그러나 이것은 작업을 완료합니다.


이걸로 해봐:

multiset<int> s;
s.erase(s.lower_bound(value));

당신 value이 세트 에서 출구 를 확인할 수 있는 한. 작동합니다.


나는 다음을 시도 할 것입니다.

equal_range()키와 동일한 요소의 범위를 찾기 위해 먼저 호출 합니다.

반환 된 범위가 비어 있지 않은 경우 erase()요소의 범위 (즉, erase()두 개의 반복자를 사용하는 요소 )입니다.

  • 첫 번째 인수는 반환 된 범위 (즉, 하나의 과거 .first반환) 에서 두 번째 요소에 대한 반복자입니다.

  • 반환 범위 쌍 반복자로 두 번째 인수 .second하나.


templatetypedef 의 (감사합니다!) 주석 을 읽은 후 편집 :

하나 (모두가 아닌) 중복을 제거해야하는 경우 : equal_range()에서 반환 된 쌍에 두 개 이상의 요소 erase()가있는 경우 반환 된 쌍의 .first를의 단일 반복자 버전으로 전달하여 첫 번째 요소가됩니다 erase().

의사 코드 :

pair<iterator, iterator> pit = mymultiset.equal_range( key );

if( distance( pit.first, pit.second ) >= 2 ) {
    mymultiset.erase( pit.first );
}

multiset < int > :: iterator it , it1 ;
it = myset.find ( value ) ;
it1 = it ;
it1 ++ ;
myset.erase ( it , it1 ) ;

 if(my_multiset.find(key)!=my_multiset.end())
   my_multiset.erase(my_multiset.equal_range(key).first);

이것은 C ++의 다중 집합에서 단일 인스턴스를 제거하는 가장 좋은 방법입니다.


사실 정답은 다음과 같습니다.

my_multiset.erase (my_multiset.find (value));

참고 URL : https://stackoverflow.com/questions/9167745/in-stdmultiset-is-there-a-function-or-algorithm-to-erase-just-one-sample-unic

반응형