这两天学习了STL,准备找几道题练练手,在这个过程中,总结了一些小的知识点。
1、set集合容器实现了红黑树的二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值。
2、平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、list容器。将键值由小到大遍历出来,并且不会重复插入相同键值的元素,采取忽略处理。如果是一个结构体其中有三个int型元素a,b,c,如果有插入的a相同,则这组数据被忽略,如插入1 2 3、1 2 4、1 3 4;则只会插入1 2 3,因为首元素相同,所以采取忽略处理。而除首元素其他元素相同则可以插入。
3、iterator迭代器的作用是遍历容器。
4、在5下面有以下知识点的练习。
创建元素:set<int>s,需要说明元素的类型;
元素的插入:s.insert(需要插入的元素),如:s.insert(8),插入元素8;
中序遍历:set<int> :: iterator it;
for( it=s.begin() ; it !=s.end();it++)
{
cout<<*it<<" ";
}
反向遍历:set<int> :: reverse_iterator it;
for( it=s.rbegin() ; it !=s.rend();it++)
{
cout<<*it<<" ";
元素的删除:s.erase(6); 删除键值为6的元素;
元素的查找:set<int>::iterator it;
it=s.find(6);
if (it != s.end() )
cout<<“找到该元素”;
5、自定义比较元素:
1> 不是结构体的元素、按键值由大到小:
#include<set>
#include<iostream>
using namespace std;
//自定义比较函数mycomp,重载"()"操作符
struct mycomp
{
bool operator ()(const int &a,const int &b)
{
return a>b;
}
};
int main()
{
//定义元素类型为int型的集合对象s,当前没有任何元素
//采用的比较函数是mycomp
set<int,mycomp>s;
//插入5个元素,由于8有重复,所以第二次的8并没有执行
s.insert(8);
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8);//第二次插入8,重复元素,不会插入
set<int,mycomp>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
cout<<endl;
return 0;
}
运行结果:
12 8 6 1
2>如果元素是结构体,那么直接可以把比较函数写在结构体内。下面的程序说明了如何操作:
#include<set>
#include<iostream>
using namespace std;
struct INFO
{
string name;
float score;
bool operator < (const INFO &a) const
{
return a.score<score;
}
};
int main()
{
//定义元素类型为INFO结构体的集合对象s,当前没有任何元素
set<INFO>s;
INFO info;
info.name="Jack";
info.score=80.5;
s.insert(info);
info.name="Tomi";
info.score=20.5;
s.insert(info);
info.name="Nacy";
info.score=60.5;
s.insert(info);
set<INFO>::iterator it;
for(it=s.begin();it!=s.end();it++)
{
cout<<(*it).name<<":"<<(*it).score<<endl;
}
return 0;
}
运行结果:
Jack:80.5
Nacy:60.5
Tomi:20.5