x64 Data Structure
名前:津田伸秀
サイト: http://vivi.dyndns.org/ twitter:vivisuke
facebook:https://www.facebook.com/nobuhide.tsuda
ぼちぼちソフト作家、年齢不詳のおじさん、自宅研究員(主席)
趣味:テニス、オセロ、思考ゲーム・パズル類
Cocos2d-x/Qt/C++ 使い, 一応webアプリ(PHP, JS, jQ, SQL)も出来るよ
Windows用テキストエディタ ViVi を延々開発中
世界最速「さくさくエディタ」 も開発中だよ
迷走中、お仕事募集中でござるぞ
全置換速度比較
template <typename T> class gap_buffer {
T *m_data; // データ領域
pos_t m_gapIndex; // ギャップ位置
ssize_t m_gapSize; // ギャップサイズ
ssize_t m_size; // データサイズ、capacity = size + gapSize
};
T GapBuffer::charAt(pos_t pos) const
{
if( pos >= m_gapIndex ) // pos がギャップ以降
pos += m_gapSize; // ギャップサイズ分補正
return m_data[pos];
}
void GapBuffer::moveGapTo(pos_t pos)
{
if( pos < m_gapIndex ) {
[pos, m_gapIndex) を [pos+m_gapSize, m_gapIndex+m_gapSize] に移動
m_gapIndex = pos;
} else if( pos > m_gapIndex ) {
[m_gapIndex+m_gapSize, pos+m_gapSize) を [m_gapIndex, pos) に移動
m_gapIndex = pos;
}
}
void GapBuffer:erase(pos_t pos) {
moveGapTo(pos); // ギャップを pos に移動
++m_gapSize; // ギャップサイズを増やすだけで文字が消える
}
void GapBuffer::insert(pos_t pos, T ch) {
if( ギャップが無い )
データエリアを(1.5~2倍に)拡張;
moveGapTo(pos); // ギャップを pos に移動
m_data[m_gapIndex++] = ch; // ギャップ先頭に文字挿入
--m_gapSize;
}
gep_deque
class gap_deque {
.....
private:
pointer m_data; // バッファ先頭アドレス
mutable size_type m_gapIndex; // ギャップ位置
mutable size_type m_gapSize; // ギャップサイズ
size_type m_tailGapSize; // 末尾ギャップサイズ
size_type m_size; // データトータルサイズ
}
Text
※ gap_buffer は O(N^2)
※ gap2_buffer はバランス処理を行わない版
template<typename T>
class hgap_buffer {
....
gap_buffer< gap_buffer<T>* > m_buffers;
};