⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dimoneindex.cpp

📁 这是一个可以检索大量数据的程序
💻 CPP
字号:
#include "DimOneIndex.h"

namespace bmi {

DimOneIndex::DimOneIndex()
{
	BITSET bs;
	m_Bitmap.insert(BITMAP::value_type( MIN_KEY, bs));
	m_Bitmap.insert(BITMAP::value_type( MAX_KEY, bs));
}

DimOneIndex::~DimOneIndex()
{
}

void DimOneIndex::Find(KEY _key, BITSET & bs)
{
	BITMAP::iterator itUp = m_Bitmap.lower_bound(_key);
	if ( itUp->first == _key )
	{
		bs = itUp->second;	
	}
	else
	{
		BITMAP::iterator itDown = itUp;
		--itDown;
		bs = itDown->second & itUp->second;
	}
}

void DimOneIndex::Find(KEY _down, KEY _up, bool bPart, BITSET & bs)
{
	BITMAP::iterator itDown = m_Bitmap.lower_bound(_down);
	BITMAP::iterator itUp = m_Bitmap.upper_bound(_up);
	BITMAP::iterator it;
	for ( it = itDown; it != itUp; ++it )
	{
		bs.operator|=( it->second );
	}
	
	if ( bPart )
	{
		if( itDown == itUp )
		{
			--itDown;
			bs = itDown->second & itUp->second;
		}
	}
	else
	{
		bs.operator&=( ~(itDown->second | itUp->second) );
	}
}

void DimOneIndex::Add(OID _oid, KEY _key)
{
	BITMAP::iterator itUp = m_Bitmap.lower_bound(_key);
	if ( itUp->first == _key )
	{	
		itUp->second.set(_oid, true);
	}
	else
	{
		BITMAP::iterator itDown = itUp;
		--itDown;
		BITSET bs = itDown->second & itUp->second; 
		bs.set(_oid, true);
		m_Bitmap.insert(BITMAP::value_type(_key, bs));
	}
}

void DimOneIndex::Add(OID _oid, KEY _down, KEY _up)
{
	if ( _down == _up )
	{
		Add(_oid, _down);
		return;
	}

	Add(_oid, _down);
	Add(_oid, _up);
	BITMAP::iterator itDown = m_Bitmap.find( _down);
	BITMAP::iterator itUp = m_Bitmap.find( _up);
	for ( ++itDown; itDown != itUp; ++itDown)
	{
		itDown->second.set(_oid, true);
	}
}

bool DimOneIndex::Del(OID _oid, KEY _key)
{
	BITMAP::iterator it = m_Bitmap.find( _key);
	if ( m_Bitmap.end() != it )
	{
		it->second.set( _oid, false);
		remove(it);
		return true;
	}
	return false;
}	

bool DimOneIndex::Del(OID _oid, KEY _down, KEY _up)
{
	if ( _down == _up )
	{
		return Del(_oid, _down);
	}

	BITMAP::iterator itDown = m_Bitmap.find( _down );
	if ( m_Bitmap.end() == itDown ) { return false; }
	BITMAP::iterator itUp = m_Bitmap.find( _up );
	if ( m_Bitmap.end() == itUp ) { return false; }

	itUp->second.set( _oid, false);
	BITMAP::iterator it = itDown;
	for ( ; it != itUp; ++it)
	{
		it->second.set( _oid, false);
	}

	remove(itDown);
	remove(itUp);
	return true;
}

void DimOneIndex::remove(BITMAP::iterator & it){
	BITMAP::iterator itDown = it;
	--itDown;
	BITMAP::iterator itUp = it;
	++itUp;
	BITSET a = itDown->second & it->second;
	BITSET b = it->second & itUp->second;
	if ( a == b )
	{
		m_Bitmap.erase( it );
	}
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -