그럼, 해시 테이블 구현 당신이 사용하고 있습니까? 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);
}
: 여기에 당신이 이런 짓을 했을까 방법의 스케치입니다.나는 또한 이 스왑의 관점에서 구현되는 경향이있는 이유 중 하나는 매우 간단하고 스왑 기능을 사용하면 코드가 매우 빨라 졌을뿐 아니라 목적을 위해 코드를 작성한다는 것입니다. 예외 안전성의 ... 당신의 스왑은 결코 실패하지 않아야하지만, 복사본 생성은 ... 그래서 복사본 생성이 예외를 던지면, 당신은 그 오브젝트의 상태를 지옥에 던지지 않았습니다.
해시 맵의 내부를 설명하면 사용자 지정 구현처럼 들립니다. 코드를 게시하거나 SGI'hash_map' 또는 TR1'unordered_map'과 같은 일반적인 구현으로 변환하십시오. (둘 다 GCC와 MSVC에서 사용할 수 있어야합니다.) 우리가 알 수있는 것은 구현시 중요한 기능이 빠져 있다는 것입니다. – Potatoswatter