Qt中数据结构使用自定义类————附带详细示例
文章目录
- C++对数据结构使用自定义类
- 1 QMap使用自定义类
- 1.1 使用自定义类做key
- 1.2 使用自定义类做value
- 2 QSet使用自定义类
- 参考
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();
}
参考
QSet Class
用QSet存储一个自定义结构体