2013-07-11 1 views
2

사용자가 데이터를 입력하는 순서를 유지해야하지만 중복을 제거해야합니다. 나는지도를 보았지만 중복 된 것을 제거했지만 사용자가 입력 한 순서를 유지하는 것은 불가능하다. 세트에 같은 문제가 있습니다. 두 요구 사항을 모두 충족시킬 수있는 stl의 데이터 구조가 있습니까? 나는이 프로젝트에서 부스트를 사용할 수 없다.삽입 순서를 유지하고 중복을 제거하기위한 C++의 데이터 구조

+0

당신이 세트와 같은 무엇을 의미합니까? 세트가 주문됩니다. – texasbruce

+0

@texasbruce : set은 삽입 순서를 유지하지 않는 map과 같습니다. –

+0

몇 개의 요소가 있습니까? 10 대? 1000 년대? 1000000? 100000000s? 10000000000s? – Yakk

답변

1

지도와 목록을 관리하십시오. 각 요소에 대해 목록에 추가하기 전에지도를 검색하십시오. 발견되지 않으면, 목록에 추가하고지도에 삽입하고, 그렇지 않으면 계속하십시오.

+0

pls가 예제를 가르쳐 주시겠습니까? 어디서 클래스의 인스턴스가 같아야하는지 지정할 수있는 사용자 지정 비교자를 지정할 수 있습니까? – Jimm

+0

"평등"이란 의미에 따라 다릅니다. 순서가 중요하지 않다면'map' (또는'set')을 비교하십시오. 순서가 중요한 경우'list' (또는'vector')를 비교하십시오. – paddy

+0

@Jimm은 ==, <, >에 대한 연산자 오버로드 만 제공합니다. –

2

검색 순서를 유지하면 중복을 검색하는 데 비용이 많이 소요되므로 두 가지 모두를 수행하는 데이터 구조를 찾지 않는 것이 문제입니다. C++ 11에서는 std::unordered_set을 소개합니다.

C++ 11을 사용하지 않으면 클래스의 일부 표준 컨테이너를 캡슐화 할 수 있습니다. set 또는 map에 항목을 올린 다음 vector에 항목에 반복기를 저장하는 것이 좋습니다.

0
#include <cstdlib> 
#include <iostream> 
#include <random> 
#include <vector> 
#include <unordered_set> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    std::vector<int> data; 
    std::unordered_set<int> uniqueCollection; 

    for(int i = 0; i < 50; ++i) 
    { 
     int newData = rand() % 27; 

     cout << "trying to insert: " << newData << endl; 

     if(uniqueCollection.find(newData) == uniqueCollection.end()) 
     { 
      cout << " inserting item: " << newData << endl; 

      data.push_back(newData);  
      uniqueCollection.insert(newData); 
     } 
     else 
     { 
      cout << " element already exists: " << newData << endl; 
     } 
    } 

    return 0; 
} 

http://www.cplusplus.com/reference/unordered_set/unordered_set/

http://www.cplusplus.com/reference/vector/

관련 문제