Mas Arya,

Makasi Mas. Dan xixixixixiixixi...maaf kemaren fungsi print_list() nya sudah 
aku buat sih, cuman lupa ngopy in, jadi maaf kalau Mas Arya ngetikin lagi.
Dan iya ini kalau saya compile dan run di linux pakai gcc jalan, cuman 
permasalahan saya (wah jadi ngaku deh, mudah2an masih mau membantu :))
saat ini saya sedang berada dalam lingkungan m$ memakai vis c++ 6.0. Nah di 
msdn nya disebutkan bahwa list.sort nya diganti dengan void sort(greater<T> 
pr). Kira2 bagaimana ya Mas solusinya?


ini dari msdn nya
list::sort
void sort();
template<class Pred>
    void sort(greater<T> pr);
Both member functions order the elements in the controlled sequence by a 
predicate, described below.

For the iterators Pi and Pj designating elements at positions i and j, the 
first member function imposes the order !(*Pj < *Pi) whenever i < j. (The 
elements are sorted in ascending order.) The member template function imposes 
the order !pr(*Pj, *Pi) whenever i < j. No pairs of elements in the original 
controlled sequence are reversed in the resulting controlled sequence.

In this implementation, if a translator does not support member template 
functions, the template:

template<class Pred>
    void sort(Pred pr);
is replaced by:

void sort(greater<T> pr);


btw.: makasih lho, malem2 masih sempet bales email, top dah. padahal aku udah 
terlelap di pulau kapuk lho :)

terimakasih.

IK








Ini salah satu caranya.

Triknya adalah gunakan fungsi sort dengan argumen ekstra, yaitu fungsi
untuk  membandingkan dua buah CData. Hal ini diperlukan karena fungsi
sort yang biasa (tanpa argument tambahan) akan membandingkan pointer
dari CData, bukan instancenya.

Hasilnya di bawah ini :

#include <stdlib.h>
#include <stdio.h>
#include <list>

#include <iostream>

class CData
{
public:
       float   m_price;
       long    m_vol;
public:
       CData(float p, long v): m_price(p), m_vol(v){}
       ~CData(){}
};

bool compare_data( const CData* d1, const CData* d2)
{ return d1->m_price < d2->m_price; }

typedef std::list<CData*> data_list_t;

void print_list( data_list_t* t)
{
  if( !t ) return;
  std::list<CData*>::const_iterator iter;
  for (iter= t->begin(); iter != t->end(); iter++)
    std::cout << (*iter)->m_price << "," << (*iter)->m_vol << std::endl;
}

int main()
{
       CData* p1 = new CData(3000.0f, 10);
       CData* p2 = new CData(2000.0f, 10);
       CData* p3 = new CData(4000.0f, 10);

       data_list_t l;
       l.push_back(p1);
       l.push_back(p2);
       l.push_back(p3);

       print_list(&l);
       l.sort( &compare_data );
       print_list(&l);

       delete p1;
       delete p2;
       delete p3;
       return 0;
}

Alternatif lain (yang lebih C++ :-) adalah menggunakan:

class compare_data
{
public:
 bool operator()(const CData* d1, const CData* d2)
 { return d1->m_price < d2->m_price; }
}; 

dan memanggilnya dengan cara:  l.sort( compare_data() );
Mau singkat sedikit? Ganti class-nya dengan struct dan hilangkan
public (karena class+public = struct).

Keuntungan cara ini: compare_data bisa digeneralisasi dengan
menggunakan template dan memanggil fungsi komparasi kelas datanya
sehingga bisa digunakan untuk melakukan sorting dari data dalam bentuk
pointer, sepanjang kelas datanya mengimplementasikan operator <
tentunya.

BTW, lain kali fungsi print_list()-nya diberikan juga dong, supaya
yang mau menjawab/membahas tidak kena kerjaan ekstra membuat dulu
fungsi yang enggak ada :-P

--
Berhenti langganan: [EMAIL PROTECTED]
Arsip dan info: http://linux.or.id/milis

Kirim email ke