C++/Qt/QMap — различия между версиями
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
|
(нет различий)
|
Версия 14:21, 25 мая 2010
Add user-defined class to QMap
#include <QString>
#include <QHash>
#include <QMap>
#include <QSet>
#include <QDebug>
class Employee {
public:
Employee(const QString &surname, const QString &forename)
{
m_forename = forename;
m_surname = surname;
}
QString forename() const { return m_forename; }
QString surname() const { return m_surname; }
private:
QString m_forename;
QString m_surname;
};
inline bool operator<(const Employee &e1, const Employee &e2)
{
if ( e1.surname() != e2.surname() )
return e1.surname() < e2.surname();
return e1.forename() < e2.forename();
}
int main()
{
Employee d1("M", "D");
Employee d2("M", "M");
Employee d3("M", "P");
QMap<int, Employee> map;
map.insert(0, d1);
map.insert(1, d2);
map.insert(2, d3);
QMapIterator<int, Employee> mi(map);
while ( mi.hasNext() ) {
mi.next();
qDebug() << mi.key() << ":" << mi.value().surname() << mi.value().forename();
}
QMap for string to int
/*
* Copyright (c) 2006-2007, Johan Thelin
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* * Neither the name of APress nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
#include <QMap>
#include <QHash>
#include <QSet>
#include <QMultiMap>
#include <QMultiHash>
#include <QString>
#include <QtDebug>
void mapStringIntDemo()
{
QMap<QString, int> map;
map["foo"] = 42;
map["bar"] = 13;
map["baz"] = 9;
QString key;
foreach( key, map.keys() )
qDebug() << key << " = " << map[key];
QMap<QString, int>::ConstIterator ii;
for( ii = map.constBegin(); ii != map.constEnd(); ++ii )
qDebug() << ii.key() << " = " << ii.value();
int sum;
sum = map["foo"] + map.value("ingenting");
foreach( key, map.keys() )
qDebug() << key << " = " << map[key];
sum = map["foo"] + map["ingenting"];
foreach( key, map.keys() )
qDebug() << key << " = " << map[key];
}
void hashStringIntDemo()
{
QHash<QString, int> hash;
hash["foo"] = 42;
hash["bar"] = 13;
hash["baz"] = 9;
QString key;
foreach( key, hash.keys() )
qDebug() << key << " = " << hash[key];
int sum;
sum = hash["foo"] + hash.value("ingenting");
foreach( key, hash.keys() )
qDebug() << key << " = " << hash[key];
sum = hash["foo"] + hash["ingenting"];
foreach( key, hash.keys() )
qDebug() << key << " = " << hash[key];
}
class Person
{
public:
Person( QString name, QString number );
QString name() const;
QString number() const;
private:
QString m_name, m_number;
};
Person::Person( QString name, QString number ) : m_name( name ), m_number( number ) {}
QString Person::name() const { return m_name; }
QString Person::number() const { return m_number; }
bool operator==( const Person &a, const Person &b )
{
return (a.name() == b.name()) && (a.number() == b.number());
}
uint qHash( const Person &key )
{
return qHash( key.name() ) ^ qHash( key.number() );
}
void hashPersons()
{
QHash<Person, int> hash;
hash[ Person( "Anders", "8447070" ) ] = 10;
hash[ Person( "Micke", "7728433" ) ] = 20;
qDebug() << hash.value( Person( "Anders", "8447070" ) ); // 10
qDebug() << hash.value( Person( "Anders", "8447071" ) ); // 0
qDebug() << hash.value( Person( "Micke", "7728433" ) ); // 20
qDebug() << hash.value( Person( "Michael", "7728433" ) ); // 0
}
void setStringDemo()
{
QSet<QString> set;
set << "Ada" << "C++" << "Ruby";
for( QSet<QString>::ConstIterator ii = set.begin(); ii != set.end(); ++ii )
qDebug() << *ii;
if( set.contains( "FORTRAN" ) )
qDebug() << "FORTRAN is in the set.";
else
qDebug() << "FORTRAN is out.";
}
void multimapStringIntDemo()
{
QMultiMap<QString, int> multi;
multi.insert( "foo", 10 );
multi.insert( "foo", 20 );
multi.insert( "bar", 30 );
QSet<QString> keys;
foreach( QString key, multi.keys() )
keys << key;
foreach( QString key, keys )
foreach( int value, multi.values(key) )
qDebug() << key << ": " << value;
QMultiMap<QString, int>::ConstIterator ii = multi.find( "foo" );
while( ii != multi.end() && ii.key() == "foo" )
{
qDebug() << ii.value();
++ii;
}
}
void multihashStringIntDemo()
{
QMultiHash<QString, int> multi;
multi.insert( "foo", 10 );
multi.insert( "foo", 20 );
multi.insert( "bar", 30 );
QSet<QString> keys;
foreach( QString key, multi.keys() )
keys << key;
foreach( QString key, keys )
foreach( int value, multi.values(key) )
qDebug() << key << ": " << value;
QMultiHash<QString, int>::ConstIterator ii = multi.find( "foo" );
while( ii != multi.end() && ii.key() == "foo" )
{
qDebug() << ii.value();
++ii;
}
}
int main( void )
{
mapStringIntDemo();
hashStringIntDemo();
hashPersons();
setStringDemo();
multimapStringIntDemo();
multihashStringIntDemo();
return 0;
}
QMap that associates a string to an integer value is created:
#include <QMap>
#include <QMapIterator>
#include <QDebug>
int main()
{
QMap<QString, int> map;
map["one"] = 1; // insert using the [] operator
map["two"] = 2;
map.insert("seven", 7); // insert using insert()
qDebug() << map["seven"]; // read using the [] operator
qDebug() << map.value("seven"); // read using value()
QMapIterator<QString, int> i(map);
while (i.hasNext()) {
i.next();
qDebug() << i.key() << ":" << i.value();
}
return 0;
}