1 °³¿ä
1...N ±îÁöÀÇ ¼ýÀÚ°¡ ÀÖ°í, ÀÌ Áß¿¡ Çϳª¸¦ »Ì¾Æ³»¼ »ç¿ëÇÏ´Ù°¡ ¹ÝȯÇϰí, ´Ù½Ã »Ì¾Æ³»°í...
Áï ÃÖ´ë N°³ÀÇ ¾ÆÀÌÅÛÀÌ ÀÖ´Ù¸é À̵éÀº ¸ðµÎ ´Ù¸¥ °íÀ¯ ¹øÈ£¸¦ °¡Áö°í, ÀÌ °íÀ¯ ¹øÈ£´Â Ç×»ó 1ºÎÅÍ N±îÁöÀÇ ¹üÀ§ ¾È¿¡ µé¾î°¡¾ß ÇÑ´Ù...´Â ÀüÁ¦¸¦ ¸¸Á·½Ã۱â À§ÇÑ ÀÚ·á ±¸Á¶.
»ç½Ç ±×³É set °°Àº °Å ½á¼ ó¸®Çصµ µÇ±ä Çϴµ¥, ¹º°¡ Á» ´õ ºü¸¥ ¹æ¹ýÀ» ã´Ùº¸´Ï, ¿¹Àü¿¡ µéÀº N°³ÀÇ ¹«ÀÛÀ§ ¹øÈ£ ÃßÃâÀÌ »ý°¢³ª¼ ¸¸µé¾îºÃ´Ù.
2 ±¸Çö
#pragma once
template <typename T>
class cDistinctNumberArray
{
private:
size_t m_Count; ///< ÇöÀç »ç¿ë ÁßÀÎ °íÀ¯ ¹øÈ£ÀÇ °¹¼ö
size_t m_Capacity; ///< ÃÖ´ë·Î ÇÒ´çÇÒ ¼ö ÀÖ´Â °íÀ¯ ¹øÈ£ÀÇ °¹¼ö
T* m_NumberArray; ///< °íÀ¯ ¹øÈ£ ¸ñ·Ï
BYTE* m_TagArray; ///< ¿¡·¯ ¹æÁö¸¦ À§ÇÑ º°µµ ¹è¿
CRITICAL_SECTION m_Lock; ///< °íÀ¯ ¹øÈ£ ÇÒ´çÀ» À§ÇÑ ¶ô
public:
/// \brief »ý¼ºÀÚ
cDistinctNumberArray(size_t count)
{
StaticAssert(Generic::IsIntegral<T>::Value);
m_Count = 0;
m_Capacity = std::max(count, static_cast<size_t>(1));
m_NumberArray = new T[m_Capacity];
m_TagArray = new BYTE[m_Capacity];
for (size_t i=0; i<m_Capacity; ++i)
{
m_NumberArray[i] = static_cast<T>(i);
m_TagArray[i] = 0;
}
InitializeCriticalSection(&m_Lock);
}
/// \brief ¼Ò¸êÀÚ
~cDistinctNumberArray()
{
delete [] m_NumberArray;
delete [] m_TagArray;
DeleteCriticalSection(&m_Lock);
}
public:
/// \brief °íÀ¯ ¹øÈ£¸¦ ÇÒ´çÇÑ´Ù.
bool Allocate(T& value)
{
value = std::numeric_limits<T>::max();
EnterCriticalSection(&m_Lock);
if (m_Count < m_Capacity)
{
value = m_NumberArray[m_Count];
m_TagArray[value] = 1;
++m_Count;
}
LeaveCriticalSection(&m_Lock);
return value != std::numeric_limits<T>::max();
}
/// \brief °íÀ¯ ¹øÈ£¸¦ ¹ÝȯÇÑ´Ù.
void Deallocate(T value)
{
EnterCriticalSection(&m_Lock);
if (static_cast<size_t>(value) < m_Capacity && m_TagArray[value] == 1)
{
std::swap(m_NumberArray[value], m_NumberArray[m_Count-1]);
m_TagArray[value] = 0;
--m_Count;
}
LeaveCriticalSection(&m_Lock);
}
private:
/// \brief º¹»ç »ý¼º ±ÝÁö
cDistinctNumberArray(const cDistinctNumberArray<T>&) {}
/// \brief ´ëÀÔ ±ÝÁö
cDistinctNumberArray<T>& operator = (const cDistinctNumberArray<T>&) { return *this; }
};
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)