2010-03-26 2 views
2

C++로 시작해서 C++에서 해시 테이블을 다른 해시 테이블로 복사하는 방법은 무엇이되어야합니까? HashMap copyOfOriginal=new HashMap(original);C++을 사용하여 해시 테이블을 다른 해시 테이블에 복사

그러나 C에 대해 ++ :

우리는 쉽게 사용하여 자바에서이 작업을 수행 할 수 있습니다? 어떻게해야합니까?

UPDATE

글쎄, 난 아마도 자바 예를 들어 줄 수있는 잘못된이었다, 아주 기본적인 수준에서 그 일을하고있다. 이것은 C++을 사용하여 구현하려고 시도한 것입니다.

이 해시 배열이 있으며 배열의 각 요소는 연결된 목록의 머리입니다. 어떤 노드가 개별 노드 (데이터와 다음 포인터)를 가지고 있습니다.

이제 각 노드가 가리키는 전체 해시 배열과 연결된 목록을 복사해야합니다.

+0

해시 맵의 내부를 설명하면 사용자 지정 구현처럼 들립니다. 코드를 게시하거나 SGI'hash_map' 또는 TR1'unordered_map'과 같은 일반적인 구현으로 변환하십시오. (둘 다 GCC와 MSVC에서 사용할 수 있어야합니다.) 우리가 알 수있는 것은 구현시 중요한 기능이 빠져 있다는 것입니다. – Potatoswatter

답변

1

그럼, 해시 테이블 구현 당신이 사용하고 있습니까? ISO C++의 현재 버전에서 제공하는 해시 테이블은 없습니다. 즉, 해시 테이블 클래스가 operator= 및 해당 복사본 생성자를 private으로 만들지 않으면 둘 다 예상대로 작동한다는 합리적인 가정이됩니다. 그렇지 않다면 버그라고 생각합니다.

따로 따로 std::unordered_map이 ISO C++ 2010에 추가되었지만 2003 개정안의 ISO C++ 1998 및 ISO C++ 1998에는 해시 맵 컨테이너가 없습니다. Microsoft는 표준이 아닌 "std :: hash_map"을 제공했으며, "std ::"네임 스페이스에 배치해서는 안됩니다. 그들은 이후 그것을 "stdext ::"(좋은 소식)로 옮겼습니다. 일부 다른 공급 업체는 MSFT를 복사하여 컴파일러가 호환되도록했습니다.

해시 테이블 구현을 즉시 사용하려면 Boost C++ Libraries에서 boost::unordered_map을 사용하십시오. Boost C++ 라이브러리는 오픈 소스이며 매우 유명하고 고품질입니다.


가 업데이트 된 질문을 바탕으로,이 작업을 수행하기 위해 = 자신의 복사 생성자, 스왑 기능, 운영자의 구현을 작성해야합니다 EDIT. 일반적으로 operator =는 일단 스왑 및 복사본 생성자를 사용하면 간단합니다. 당신은 위의 서명을하고 선언에 추가해야합니다

 
template<typename T> 
HashTable<T>::HashTable(const HashTable<T>& o) 
{ 
    // pseudo code: 
    //  initialize as in HashTable<T>::HashTable() 
    //  for each key/value pair in o: 
    //  insert that key/value pair into this instance 
    // 
    // NOTE: 
    //  if your hash table is sized so that the number of 
    //  elements is a prime number, you can do better 
    //  than the pseudo-code given above, but otherwise 
    //  copying element by element is the way to go. 
    // 

    // BEGIN YOUR CODE 
    // ... 
    // END YOUR CODE 
} 

template<typename T> HashTable<T>& 
HashTable<T>::swap(HashTable<T>& o) 
{ 
    // Swap data pointers 
    T* datatmp = _data; 
    _data = o._data; 
    o._data = datatmp; 

    // Swap capacity 
    size_t captmp = _capacity; 
    _capacity = o._capacity; 
    o._capacity = captmp; 

    // Swap other info 
    // ... 

    // Report self 
    return *this; 
} 
 
template<typename T> HashTable<T>& 
HashTable<T>::operator=(const HashTable<T>& o) 
{ 
    HashTable<T> cpy(o); 
    return swap(cpy); 
} 

: 여기에 당신이 이런 짓을 했을까 방법의 스케치입니다.나는 또한 이 스왑의 관점에서 구현되는 경향이있는 이유 중 하나는 매우 간단하고 스왑 기능을 사용하면 코드가 매우 빨라 졌을뿐 아니라 목적을 위해 코드를 작성한다는 것입니다. 예외 안전성의 ... 당신의 스왑은 결코 실패하지 않아야하지만, 복사본 생성은 ... 그래서 복사본 생성이 예외를 던지면, 당신은 그 오브젝트의 상태를 지옥에 던지지 않았습니다.

+1

공정한 이유는 그것이 Dinkumware의 STL 배송에 있었기 때문입니다. STL에는 hash_map이 포함되어 있습니다. 이는 SGI의 원래 STL에 있었기 때문입니다. –

2

사용중인 해시 맵이 어느 것이 든 복사 생성자가 있고 아마도 operator= 일 것입니다.

hashmap_type newMap = oldMap; // copies 

그리고 그게 전부입니다. C++에는 표준 해시 맵이 없습니다.

+2

@stefanB, 아니, 틀렸어. std :: unordered_map이 C++ 0x에 추가되었지만 ISO C++ 1998 (2003 ammendments)에는 해시 맵 클래스가 없습니다. –

+0

STL은 C++이 아닙니다. C++에는 표준 해시 맵이 없습니다. 단, C++ 0x가 완료되면'std :: unordered_map'이 해당 void를 채 웁니다. –

+2

@Dennis, STL은 C++ 언어의 일부입니다 ... 표준 라이브러리는 C++의 일부로서 언어 구문 및 의미론과 마찬가지로 동일한 표준화 프로세스에서 채택됩니다. –

2

C++에서는 복사 생성자 또는 값을 사용하는 간단한 할당을 사용하여이를 수행합니다. 예를 들어

std::map<int,string> map1 = CreateTheMap(); 
std::map<int,string> map2 = map1; 
std::map<int,string> map3(map1); 
+2

std :: map은 해시 맵이 아닙니다. –

+1

좋아,'unordered_map'으로 대체하십시오. –

+0

@Michael, 이것은 일반적인 질문의 더 많은 것으로 보입니다. 나는 OP가 정확하게 Java 의미와 일치하는 C++ 타입을 포함하는 예제를 찾고 있다고 생각하지 않는다. – JaredPar

0

구현의 세부 사항에 대해 말씀 드렸으므로 어쨌든 사용자 정의 HashMap 클래스를 사용하고 있습니다. 이제

Foo copy(original); 
Foo copy2 = original; 

: 그것은 구문 중 하나를 호출 할 수 있습니다

class Foo 
{ 
public: 
    Foo(); // regular constructor 

    Foo(const Foo& rhs); // copy constructor 
}; 

:이 클래스를 복사에 관해서

C++에서

는, 같은 구문이 보이는 특수 목적 Copy Constructor,이 HashMap에 복사 생성자가 없으면 boost::unordered_map 또는 사용 가능한 경우 std::hash_map, std::tr1::hash_map 또는 std::tr1::unordered_map과 같은 기존 구현으로 전환하는 것이 가장 좋습니다. 그 이유는 std:: 가능성이 있기 때문에 많은 STL은 표준화되기 훨씬 전에 hash_map을 특징으로합니다. unordered_map는 여기에 머물러 있으며, 부스트도 있습니다.

전환 할 수없는 경우 어떻게 든 복사 작업을 구현해야합니다.

관련 문제