stl容器之--自定义结构体作为stl容器元素成员的使用
2015-05-12 14:44
344 查看
自定义结构体作为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
《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
相关文章推荐
- 为什么auto_ptr智能指针不能作为STL标准容器的元素
- auto_ptr智能指针不能作为STL标准容器的元素
- STL使用list的成员函数push_back和push_front插入一个元素到list中
- std::map 如何使用结构体作为自定义键值
- STL容器元素深/浅拷贝问题和STL容器使用时机
- STL中vector容器中元素为自定义类型时的效率分析
- auto_ptr预防作为STL容器元素的实现。
- 为什么auto_ptr智能指针不能作为STL标准容器的元素
- stl容器内指针元素的使用与释放
- C++ STL中容器部分 有关deque(双端数组形式)的初始化 元素插入 遍历 以及distance()函数的使用 20180322day12
- STL中map容器使用自定义key类型报错详解
- Windows程序的模块之间为什么不能使用STL容器作为参数
- STL中vector容器中元素为自定义类型指针时的内存泄漏问题
- 什么样的对象才能作为STL容器的元素
- stl容器内指针元素的使用与释放
- 多线程中使用迭代器 访问 STL 容器元素的越界问题
- STL中容器使用自定义排序时出现assert
- 使用STL去除std::vector自定义结构体重复项
- 转载: STL序列式容器中删除元素的方法和陷阱一 .
- 容器扩展点3 使用FactoryBean自定义初始化逻辑