2012-05-05 3 views
1

응용 프로그램의 부스트와 표준에서 unordered_set을 사용하려고 할 때,이 세트의 특정 요소의 색인, 즉 위치를 찾는 것이 목표입니다. 결과 간에는 미묘한 차이가 있습니다. 부스트의 요소는이 간단한 프로그램에 따라 바뀝니다. 문제가 어디에 있습니까?부스트와 표준의 unordered_set의 차이점

간단한 '무엇을-경우'코드 : 부스트와

#include <iostream> 
#include <iterator> 
#include <unordered_set> 
#include <boost/unordered_set.hpp> 

//using boost::unordered_set; 
using std::unordered_set; 
using std::distance; 

int main() 
{ 
    unordered_set<int> Set; 
    int sz = 10; 
    for(int k=0;k<sz;k++) 
     Set.insert(k); 
    unordered_set<int>::iterator ind_searched = Set.find(8); 
    unordered_set<int>::size_type indx = distance(Set.begin(), 
               ind_searched); 
    std::cout << " Index of element is " 
      << indx << std::endl; 
    return 0; 
} 

내가

Index of element is 1 

을 얻을 표준 unordered_set와 내가 얻고 것은

Index of element is 8 

나는

으로 모두 컴파일
g++ sgi_stl_1.cc -I /home/utab/external_libraries/boost_1_48_0/ -std=c++0x 
+2

접두어'unordered '는 이유가 있기 때문에 실제로 존재합니다. 이러한 컨테이너의 순서는 정의되어 있지 않으므로 여기에 의존해서는 안됩니다. – pmr

답변

6

unordered_map, unordered_set, multi 또는 이와 동등한 번호 또는 hash_set 또는 hash_maps의 구현 내에서 주문에 대한 어떠한 가정도해서는 안됩니다. 요소가 완전히 구현 된 것으로 저장되고 시간이 지나치게 변경되는 장소를 고려하십시오. 주문은 boost 표준과 C++11 표준 사이에서 달라질뿐만 아니라 하드웨어 플랫폼이 다르거 나 다른 C++ 구현간에 달라질 수 있습니다. 특정 순서에 의존하는 코드에는 결함이 있습니다. 그래서, 귀하의 질문에 대답

어디에 문제가 있습니까?

이 문제는 정렬되지 않은 데이터 구조에서 일부 데이터 순서를 가정 할 때만 발생합니다.

+0

내 생각으로는 삽입 된 요소가 삽입 된 순서로 저장된다는 것이므로 이제는지도를 만드는 동안 요소 및 인덱스에 std :: map 을 사용하는 것이 가장 좋습니다. 그런 다음 검색 키를 사용하여 가치를 색인으로 사용하면 더 좋은 옵션이 보이지 않습니까? –

+1

@UmutTabak 내가 이해하고 있는지 잘 모르겠다. 그것은 여분의지도를 사용하여 조금 복잡하게 들린다. 주문에 신경 쓰면 벡터 또는 목록을 사용하십시오. 빨리 검색하고 삽입하려면 unordered_map을 사용하십시오. 어쩌면 당신이 실제로하려고하는 것을 설명 할 수 있습니까? – juanchopanza

+0

잘 원래 게시물에 설명 된대로, 목표는 장소, 즉,이 집합의 특정 요소의 색인을 찾는 것입니다. 1 7 4 2가 요소이고 요소 4의 색인은 3입니다. 그래서 이것이 내가하고 싶은 것이지만 원래 집합의 요소는 순서가 지정되지 않아야하며,이 색인을 찾고 싶습니다. 그 정보를 사용하여 필요한 정보를 추출하십시오 ... –