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));
'programing' 카테고리의 다른 글
C # / VB.NET에서 T-SQL CAST 디코딩 (0) | 2020.12.13 |
---|---|
큰 카디널리티 계산을위한 LogLog 및 HyperLogLog 알고리즘 (0) | 2020.12.13 |
Picasa // Google + 동기화 폴더의 갤러리에서 이미지를 가져올 수 없습니다. (0) | 2020.12.13 |
상태 저장 서비스를 사용할시기와 Azure Service Fabric의 외부 지속성에 의존하는시기 이해 (0) | 2020.12.13 |
Android 페이지 말림 애니메이션 (0) | 2020.12.13 |