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