고유 요소의 주어진 std::set< T, less >
또는 std::map< T, less >
컨테이너. less
이기종 비교기입니다. 즉, 다른 유형 U
의 값을 type 값과 비교할 수 있습니다 T
. type의 모든 값 T
이 고유 한 반면 type의 T
특정 값과 동일하게 비교 되는 type 값이 많이있을 수 있습니다 U
. 정의되지 않은 동작입니까?
컨테이너에서 type 값에 해당하는 키가있는 (하나) 요소를 찾고 싶습니다 U
. 어느 하나 : 첫 번째, 마지막 또는 중간에 둘 이상이있는 경우. 컨테이너 u
에는 type 의 값 과 동일한 요소가 하나 이상 있다는 것을 알고 U
있습니다. 사용 std::set::find
하거나 사용할 수 있습니까 std::map::find
? 그것이 행동을 정의되지 ?
예 (여기에서는 허용 오차와의 부정확 한 비교 0.2
) :
#include <set>
#include <iostream>
double const eps = 0.2;
struct less
{
bool operator () (double l, double r) const { return l < r; }
using is_transparent = void;
bool operator () (int l, double r) const { return l + eps < r; }
bool operator () (double l, int r) const { return l + eps < r; }
};
int main()
{
std::set< double, less > s{0.0, 0.9, 1.0, 1.1, 2.0};
for (auto it = s.find(1); it != std::end(s); it = s.find(1)) {
std::cout << *it << ' ';
s.erase(it);
}
}
출력 (일반적으로 지정되지 않은 주문) :
0.9 1 1.1
위와 같이 고유 요소의 연관 정렬 컨테이너를 사용하는 것이 UB입니까?
대신 std::multiset
and std::multimap
를 사용해야합니까 ?
연관 컨테이너 요구 사항 테이블 앞의 설명 텍스트는 다음과 같습니다.
kl
값은하다a
[ SIC ] 분할에 대해 ([alg.sorting])c(r, kl)
으로r
의 키 값e
과e
의a
; 에 대해 분할ku
되는 값입니다 . 이러한 값 에 대하여 분할 과 함께 암시는 .a
!c(ku, r)
ke
a
c(r, ke)
!c(ke, r)
c(r, ke)
!c(ke, r)
그런 다음 a_tran.{find,count,equal_range}(ke)
, a_tran.lower_bound(kl)
및 의 동작을 설명합니다 a_tran.upper_bound(ku)
. 따라서 요구 사항은 다음과 같습니다.
find
, count
및 equal_range
:
c(r, ke)
하고!c(ke, r)
c(r, ke)
암시해야한다 !c(ke, r)
lower_bound
컨테이너의 요소는에 대해 분할되어야합니다 c(r, kl)
.upper_bound
컨테이너의 요소는에 대해 분할되어야합니다 !c(ku, r)
.이러한 요구 사항을 충족한다면 컨테이너의 여러 키에 해당하는 항목으로 이기종 조회를 사용하는 데 아무런 문제가 없습니다. 결국 원래 제안 에서 동기를 부여하는 예는 이름이 "Smith"인 모든 사람을 찾는 것 set
입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다