C++对数据结构使用自定义类
1 QMap使用自定义类
1.1 使用自定义类做key
QMap<key,value>
中数据存入时会对存入key
值的数据进行比较,并按照比较后的顺序进行排序存储,因此需要重载运算符函数<
。
实例如下:
struct Animal{
Animal(int size, int area):m_size(size),m_area(area){}
~Animal(){}
//重载运算符函数
bool operator<(const Animal &a) const //注意这里的两个const
{
if(m_size == a.m_size){
return m_area > a.m_area;
}else{
return m_size > a.m_size;
}
}
int m_size;
int m_area;
};
QMap<Animal, int> g_AnimalTypeHash;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Animal tmpA1 = Animal(20, 1);
g_AnimalTypeHash[tmpA1] = 2;
return a.exec();
}
1.2 使用自定义类做value
QMap<key,value>
中,当自定义类为value
,每当赋值时,都会用到默认构造函数、拷贝构造、赋值运算符函数。如果没有重写构造函数,则编译器会帮忙编写上面的函数。
实例如下:
struct Animal{
int m_size;
int m_area;
};
QMap<int, Animal> g_AnimalTypeHash2;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Animal tmpB1;
tmpB1.m_size = 1;
tmpB1.m_area = 2;
g_AnimalTypeHash2[2] = tmpB1;
return a.exec();
}
如果自己重写了构造函数,则需要重新编写拷贝构造、赋值运算符、析构函数。
实例如下:
struct Animal{
Animal(){}
Animal(int size, int area):m_size(size),m_area(area){}
~Animal(){}
Animal(const Animal& a){//拷贝构造
this->m_size = a.m_size;
this->m_area = a.m_area;
qDebug()<<"拷贝构造";
}
Animal& operator =(const Animal& a) //赋值运算符
{
if (this != &a)
{
this->m_size = a.m_size;
this->m_area = a.m_area;
}
qDebug()<<"赋值运算符";
return *this;
}
int m_size;
int m_area;
};
QMap<int, Animal> g_AnimalTypeHash2;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Animal tmpA1 = Animal(20, 1);
g_AnimalTypeHash2[2] = tmpA1;
return a.exec();
}
2 QSet使用自定义类
使用自定义类做映射类型,必须重写赋值==
运算符函数和编写全局的qHash函数
,因为QSet是基于QHash实现的(哈希表)。而且QHash存储的必须是值,不能是指针类型。
以下为官方解释:
错误的例子:
struct Animal{
bool operator<(const Animal &a) const //注意这里的两个const
{
if(m_size == a.m_size){
return m_area > a.m_area;
}else{
return m_size > a.m_size;
}
}
int m_size;
int m_area;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSet<Animal> animalsSet;
Animal animal;
for(int i = 0;i < 10;i++){
animal.m_size = i;
animal.m_area = i*i;
animalsSet.insert(animal);
}
return a.exec();
}
编译器会爆出如下的错误:
1,error: no matching function for call to 'qHash(const Animal&)' ,
;
2,error: no match for 'operator==' (operand types are 'const Animal' and 'const Animal')
;
正确的示例如下:
struct Animal{
bool operator==(const Animal &a) const{
if(m_size == a.m_size){
return m_area > a.m_area;
}else{
return m_size > a.m_size;
}
}
int m_size;
int m_area;
};
uint qHash(const Animal& a)
{
return a.m_area + a.m_size;
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSet<Animal> animalsSet;
Animal animal;
for(int i = 0;i < 10;i++){
animal.m_size = i;
animal.m_area = i*i;
animalsSet.insert(animal);
}
return a.exec();
}