multiset で sorted collection を作る

multiset を使うと、オブジェクトのソート機能つきの 配列が簡単に実現できました。
くわしくは下のサンプルを見てください。
なお、このサンプルは Musser and Saini, "STL Tutorial and Reference Guide" の multiset のサンプルを、 文字ではなくクラスのオブジェクトを格納するように 変更したものです。

// 
// multiset で sorted collection を作る
//
#include <list.h>
#include <assert.h>
#include <iostream.h>

#include <multiset.h>  // for gcc-2.8.1 and libg++
// #include <set>      for Visual C++ Ver.6.0

class Data {
public:
    Data( int t, int v ) {
	m_time = t;
	m_value1 = v;
    }
    int m_time;
    int m_value1;
} ;


typedef Data * DataPtr;

class DataLess {
public:
    bool operator() ( const DataPtr &p, const DataPtr &q ) const {
	if ( p->m_time != q->m_time )
	    return p->m_time < q->m_time ;
	else
	    return p->m_value1 < q->m_value1 ;
    }
} ;


int main()
{
  list<DataPtr> list1;
  list1.push_back( new Data( 1, 100 ) );
  list1.push_back( new Data( 3, 300 ) );
  list1.push_back( new Data( 3, 370 ) );
  list1.push_back( new Data( 2, 220 ) );
  list1.push_back( new Data( 3, 310 ) );
  list1.push_back( new Data( 3, 330 ) );
  list1.push_back( new Data( 3, 350 ) );
  list1.push_back( new Data( 3, 390 ) );
  list1.push_back( new Data( 5, 520 ) );
  list1.push_back( new Data( 4, 460 ) );
  
  multiset<DataPtr, DataLess> multiset1;

  list<DataPtr>::iterator i;
  for (i = list1.begin(); i != list1.end(); ++i)
      multiset1.insert(*i);
  
  multiset<DataPtr, DataLess>::iterator k;
  for (k = multiset1.begin(); k != multiset1.end(); ++k) {
      cout << "time=" << (*k)->m_time << " val=" << (*k)->m_value1 << endl;
  }

}

実行結果

time=1 val=100
time=2 val=220
time=3 val=300
time=3 val=310
time=3 val=330
time=3 val=350
time=3 val=370
time=3 val=390
time=4 val=460
time=5 val=520

Takuya NISHIMOTO
Last modified: 2009-09-05 (created on 1998-12-05)