stl容器之--自定义结构体作为stl容器元素成员的使用

自定义结构体作为stl容器元素成员的设计要求之一是:在对待自定义类型时和内置类型必须是一致的,甚至自定义类型的支持更好。

《C++标准程序库》:

set和multiset

set和multiset会根据特定的排序准则,自动将元素排序。两者不同在于multiset允许重复而set不允许。

只要是assignable、copyable、comparable(根据某个排序准则)的型别T,都可以成为set或multiset的元素型别。没有传入特别排序准则,就采用缺省准则less(这是一个仿函数,以operator<对元素进行比较,一般完成排序)。对于“排序准则”,必须是“反对称的”,必须是“可传递的”,必须是“非自反的”(x<x永远为假),所以排序准则可以用于相等性检验。

Lists

Lists使用一个双向链表来管理元素。任何型别只要具备assignable和copyable两性质,就可以作为list的元素。

Maps和Multimaps

Map和Multimap的元素型别Key和T,必须满足一些两个条件:

1、key/value必须具备assignable和copyable性质。

2、对排序准则而言,key必须是comparable。

使用set作为stl容器元素成员的例子如下:

#include <iostream>
#include <string>
#include <set>
using namespace std;

struct A{
	A():str(""),score(0){}//default construction
	A(const A& a):str(a.str),score(a.score){}//copyable
	bool operator <(const &rhs)const{return score < rhs.score;}//comparable
	A& operator = (const rhs)//assignable
	{
		str = rhs.str;
		score = rhs.score;
	}
	string str;
	int score;
};

void test(){
	set<A>s;
	A a,b,c;
	a.str="a";a.score=1;
	b.str="b";b.score=2;
	c.str="c";c.score=3;

	A cpy(a);
	cout<<"orign:"<<a.str<<','<<a.score<<endl;
	cout<<"copy:"<<cpy.str<<','<<cpy.score<<endl;

	A assigned;
	assigned = a;
	cout<<"assigned:"<<assigned.str<<','<<assigned.score<<endl;

	cout<<"a<b?"<<(a<b?"true":"false")<<endl;

	s.insert(a);
	s.insert(b);
	s.insert(c);

	cout<<"size:"<<s.size()<<endl;
}

int main() {
    test();
    return 0;
}

程序输出:

orign:a,1

copy:a,1

assigned:a,1

a<b?true

size:3

时间: 2024-10-07 00:26:09

stl容器之--自定义结构体作为stl容器元素成员的使用的相关文章

hdu 4941 Magical Forest(STL map &amp; 结构体运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 220    Accepted Submission(s): 105 Problem Description There is a forest c

qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)

参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象. 3.在读取的时候,采用QVariant对象的value方法返回自定义对象. 写入: //类型转换 QVariant v; v.setValue(MyStruct);  读取: //转换为自定义的结构体实例 MyStruct s = v.va

JS自定义结构体数组

废话不多说,直接上代码 <script>    var s_keySearch = {      key_name:Array(),      key_index:Array(),      key_count:Array(),      key_scount:Array()   };    for(i=0;i<3;i++){;   s_keySearch.key_name[i]="内衣"+i;   s_keySearch.key_index[i]= i;   s_k

typedef 和 自定义结构体类型

在自定义结构体类型时会用到typedef关键字.大家都知道typedef是取别名的意思,在C语言中跟它容易混淆的有const,#define等,其区别不在本篇文章讨论之列. 1 /*定义单链表结点类型*/ 2 3 typedef char ElemType; 4 5 typedef struct dNode {//声明单链表结点类型 6 7 ElemType data; 8 9 struct dNode *next; //指针域 }LNode, *LinkList; //定义此结构体变量stru

set容器中放入结构体时需要重载运算符&lt;

今天在做百度之星热身赛时候 发现我的Set容器不行了   由于放入的是结构体 总是报错 找了n久的错误啊   也没有找到 最后和别人的代码对比才发现少些了一部分 在网上又搜搜 发现当set容器放入结构体内容是 需要重载运算符<   也就是写出来比较规则 struct node { int a,b,c,d; bool friend operator<(node x,node y) { if(x.a<y.a) return true; if(x.a==y.a&&x.b<

QT:用QSet储存自定义结构体的问题——QSet和STL的set是有本质区别的,QSet是基于哈希算法的,要求提供自定义==和qHash函数

前几天要用QSet作为储存一个自定义的结构体(就像下面这个程序一样),结果死活不成功... 后来还跑到论坛上问人了,丢脸丢大了... 事先说明:以下这个例子是错误的 [cpp] view plaincopyprint? #include <QtCore> struct node { int cx, cy; bool operator < (const node &b) const { return cx < b.cx; } }; int main(int argc, cha

【STL学习】sort函数之自定义结构体数组

最近经常用到结构体数组排序,所以把用sort对结构体数组排序整理一下. #include<iostream> #include<algorithm>//需要加该头文件 using namespace std; struct define{ int a; int b; }d[10]; bool compare(const define &x,const define &y); int main() { for(int i=0;i<10;i++){ cin>

[UE4]自定义结构体、类、数据表

自定义数据表: #pragma once #include "CoreMinimal.h" #include "Engine/UserDefinedStruct.h" #include "Components/CanvasPanel.h" #include "Blueprint/UserWidget.h" #include "Runtime/Engine/Classes/Engine/UserDefinedStruc

Qt 信号槽传递自定义结构体

Qt 在信号和槽中使用自己定义的结构体