2012-11-09 2 views
3

std::set에는 int 값이 포함되어 있습니다. 이제 반복자를 사용하여 setvalue 인 지 여부를 확인합니다. 컴파일 ++std :: iterator없이 검색 C++

없는 일치를 G를 사용할 때

std::set<int> fdsockets; 

void myfunc(int fd) 
{ 
    if(fdsockets[fd] != fdsockets.end()) 
    { 
      // my code 
    } 
} 

하지만 난이 오류가 있습니다

하지만 내 응용 프로그램은 내가 그런 일을 할 수있는, 매우 ofter이 검색을 사용하고 반복자가 너무 느려 사용하여 검색 '연산자 []'in 'fdsockets [fd]'

아마도 std::set 대신 사용할 수 있습니까?

감사합니다.

+1

http : //en.cppreference. –

+0

집합에 대한 루프상에서'find()'를 선호하는 이유는'find()'가 O (log (N)) 알고리즘이라는 것입니다. O (N * log (N * log (N * log (N * log (N * log) 알고리즘)의 알고리즘이라고 생각됩니다.) 연산자 인 ++()가 연관 컨테이너에 대해 꽤 복잡하기 때문에 루프가 O (N)보다 나쁩니다. –

+0

std :: set에는 O (log (n)) 인 find() 메소드가 있습니다 –

답변

4

std::unorered_set 또는 이진 검색을 사용하는 vector은 간단한 멤버십 테스트에 더 효과적입니다. intergers의 최대 값이 낮 으면 조회 테이블이 대안 일 수 있습니다.

+2

바이너리 검색을 사용하여 정렬 된 '벡터'는 드물게 벡터에서 요소를 추가하거나 제거하지 않는 경우보다 효과적입니다. 각 삽입 또는 제거에는 nlgn 시간이 필요합니다. 하지만 검색 속도가 훨씬 빨라집니다. – Yakk

+0

당신 말이 맞아요. 이진 검색 또는 정적 테이블은 정적 데이터 전용입니다. – hansmaad

+0

@Yakk 확실하지 않습니다. 데이터 세트의 크기에 따라 다릅니다. 'int '를 복사하는 것은 매우 값싼 작업입니다. 삽입과 삭제는 비교적 큰 데이터 세트에서도'std :: set'을 사용하는 것보다 정렬 된 벡터를 사용하는 것이 더 저렴할 수 있습니다 : 한 할당의 가격에 대해 많은 데이터를 복사 할 수 있습니다. (삽입 비용도 저렴합니다.). –

2

std :: set에 연산자 []가 없습니다.

당신은 아마 당신이 반복자를 필요로하지 않으면 set::find()

if(fdsockets.find(fd) != fdsockets.end()) 
{ 
     // my code 
} 
4

을 의미하는 set::find 반환 (그냥 실제로 안 갈, 존재를 테스트하고 fdsocket에 액세스), 여기에 대안이 있습니다 :

if(fdsockets.count(fd)) 
{ 
     // my code 
} 
0

를 원하는 것 소리

if(fdsockets.find(fd) != fdsockets.end())