문제
나는 같은 것을 원한다 std ::지도, 그러나 나는 항목이 존재하는지 아닌지를보고 싶다. 나는 실제로 키와 값이 필요하지 않다. 무엇을 사용해야합니까?
해결책
필요한 것 같습니다 std :: 세트.
다른 팁
동일한 유형의 행동을 원한다면 std::map
, 당신은 원합니다 std::set
.
삽입/삭제 및 쿼리 작업을 믹싱하는 경우 std::set
아마도 최선의 선택 일 것입니다. 그러나 먼저 세트를 채우고 쿼리를 따라 따라갈 수 있다면 사용하는 것이 좋습니다. std::vector
, 정렬 한 다음 바이너리 검색을 사용하여 벡터의 존재를 확인하십시오.
당신이 정말로 존재가 필요하지 않으면 질서조차 필요하지 않다면, 당신은 unordered_set
. 좋아하는 C ++ 0X 공급 업체에서 제공되거나 boost.org.
데이터가 숫자 인 경우 공간에 최적화 된 std :: 벡터를 사용할 수 있습니다.
D:\Temp>type vectorbool.cpp
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<bool> vb(10);
vb[5] = true;
for (vector<bool>::const_iterator ci = vb.begin(); ci != vb.end(); ++ci) {
cout << *ci << endl;
}
}
D:\Temp>cl /nologo /W4 /EHsc vectorbool.cpp
vectorbool.cpp
D:\Temp>vectorbool.exe
0
0
0
0
0
1
0
0
0
0
당신은 아마 볼 것입니다 stl::set
필요한 것을 위해. ㅏ stl::bitset
또 다른 옵션입니다.
이 중 어느 것이 더 나은지 정의 할 정보를 어떻게 사용해야하는지에 따라 다릅니다. ㅏ set
정렬 된 데이터 구조, 삽입, 찾기 및 삭제 시간은 O (log n) 시간입니다. 그러나 필요하다면 반복 당신이 "존재"로 표시 한 모든 값에 대해 set
갈 길입니다.
표시하고 조회하면됩니다 사실 그게 세트의 구성원입니다. bitset
당신에게 더 좋을 수도 있습니다. 삽입, 찾기 및 삭제는 O (1) 만 필요하지만 수집 할 수 있습니다. int
가치. 모든 표시된 값을 반복하면 설정된 멤버를 찾기 위해 전체 세트를 거쳐야합니다. true
. 당신은 a와 함께 사용할 수 있습니다 STL ::지도 값에서 숫자 값에 매핑하려면 bitset
필요합니다.
세트의 값으로 수행 해야하는 작업을 살펴보고 적절한 데이터 구조를 선택할 수 있어야합니다.
원하는 목적으로 std :: 맵을 계속 사용할 수 있습니다.
맵에 특정 항목 (키 유형)이 존재하는지 확인하려면 다음 코드를 사용할 수 있습니다.
if (mapObj.count(item) != 0)
{
// item exists
}
앞서 대답했듯이 std :: set도 작업을 수행합니다. 흥미롭게도 세트와지도는 내부적으로 나무로 표시됩니다.
키가 값이라면 세트가 아닌 "블룸 필터"를 고려할 수도 있습니다.