2009年6月8日 星期一

QMap

QMap實在是超好用的啦~
因為,目前在寫sctp的網路應用程式,所以,我必需記錄每一個ip現在的情況,所以對應的呢,應該是我給他一個ip,系統會給我一堆這一個ip的相關資訊。

這個關係就是我給他index,而他給我資料。
QMap的另一個重點是它回傳的是指標。
而QPtrList是由共同的index來處理所有使用這一個QPtrList的元素。
所以當有多個thread要共同使用這一個QPtrList就會出現問題。

而QMap有
find()這一個函式,而且回傳的是Iterator,應該說是指標的一種,因此,可以在不同的函式中使用,而不會互相干擾。

這裡有一個例子,來說明如何使用QMap
QMap有兩個組成元素,一個是key,一個是data
我們都是由key去尋找data
main.cpp

#include <qstring.h>
#include <qmap.h>
#include <qstring.h>
#include <qapplication.h>

class Employee
{
public:
Employee(): sn(0) {}
Employee( const QString& forename, const QString& surname, int salary ) : fn(forename), sn(surname), sal(salary)
{ }

QString forename() const { return fn; }
QString surname() const { return sn; }
int salary() const { return sal; }
void setSalary( int salary ) { sal = salary; }

private:
QString fn;
QString sn;
int sal;
};

int main(int argc, char **argv)
{
QApplication app( argc, argv );

typedef QMap<QString, Employee> EmployeeMap;
EmployeeMap map;

// 新增相對應的元素, 同時設定key與data
map["JD001"] = Employee("John", "Doe", 50000);
map["JD002"] = Employee("Jane", "Williams", 80000);
map["TJ001"] = Employee("Tom", "Jones", 60000);

// 先建立data,再建立key
Employee sasha( "Sasha", "Hind", 50000 );
map["SH001"] = sasha;
sasha.setSalary( 40000 );

EmployeeMap::Iterator it;
for ( it = map.begin(); it != map.end(); ++it ) {
printf( "%s: %s, %s earns %d\n",it.key().latin1(),it.data().surname().latin1(),it.data().forename().latin1(),it.data().salary() );
}

// 透過find去尋找相對應的值
it = map.find("JD001");
printf( "%s: %s, %s earns %d\n",it.key().latin1(),it.data().surname().latin1(),it.data().forename().latin1(),it.data().salary() );

// 透過find去尋找, 若找不到會回傳值會等於map.end()
it = map.find("Hello");
if (it == map.end())
{
qWarning("do not find the element");
}
return 0;
}

沒有留言: