STL之set具体解释(二)
2017-05-11 16:02
399 查看
首先来看看set集合容器:
set集合容器实现了红黑树的平衡二叉树数据结构。在插入元素时它会自己主动调整二叉树的排列,把该元素放到适当的位置,而且
保证左右子树平衡。平衡二叉检索树採用中序遍历算法。
对于set,vector,map等等,它们的前向迭代器定义是这种(以set为例):
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){}
那么反向迭代器呢?
set<int>::reverse_iterator rit;
for(rit=s.rbegin();rit!=s.rend();rit++){}
经常用法:insert(),erase(),find(),clear()
find()方法是查找元素方法。假设找到就返回该元素迭代器的位置,否则就返回最后一个元素后面的一个位置。
这样来使用:
it=s.find(5);
if(it!=s.end()) {}
else {}
关于比較函数:
假设元素不是结构体。而是基本数据类型,那么就自定义一个比較函数:
[cpp] view
plaincopy
struct cmp
{
bool operator()(const int &a,const int &b)
{
return a>b;
}
};
int main()
{
set<int,cmp> s;
for(int i=1;i<10;i++)
s.insert(i);
set<int,cmp>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
return 0;
}
假设元素是结构体,那么比較函数直接能够写在结构体里面。
[cpp] view
plaincopy
struct Student
{
string name;
double score;
bool operator < (const Student &a) const
{
return a.score<score;
}
};
set<Student> s;
对于set容器来说。它不能有keyword同样的元素同一时候存在,假设要保留同样的元素,就用multiset多重集合容器。
其基本操作跟set集合容器几乎相同一样。定义方法是:multiset<string> ms;
map映照容器:
map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一相应关系。
map也是用红黑树实现
的。
同set一样,map不同意插入元素键值同样,而multimap多重应照集合能够同意键值反复。
用法:
[cpp] view
plaincopy
int main()
{
map<string,double> m;
m["Jack"]=98.0;
map<string,double>::iterator it;
for(it=m.begin();it!=m.end();it++)
cout<<(*it).first<<" "<<(*it).second<<endl;
return 0;
}
主要方法有:insert(),clear(),erase(),find()等等,基本跟set一样。对于multimap用法跟map几乎相同一样。
std::pair基本的作用是将两个数据组合成一个数据,两个数据能够是同一类型或者不同类型。
比如 std::pair<int,float> 或者 std::pair<double,double>等。
pair实质上是一个结构体。其基本的两个成员变量
是first和second。这两个变量能够直接使用。
初始化一个pair能够使用构造函数,也能够使用std::make_pair函数。
make_pair函数的定义例如以下:
[cpp] view
plaincopy
template pair make_pair(T1 a, T2 b)
{
return pair(a, b);
}
所以m.insert(pair<string,double>("Luce",88.5));
与 m.insert(make_pair("Luce",88.5)); 是相同的效果。
演示样例:
[cpp] view
plaincopy
int main()
{
typedef pair<string,double> lesson;
typedef multimap<string,lesson> stu;
stu a;
a.insert(make_pair("Jack",lesson("math",90.5)));
a.insert(make_pair("Jack",lesson("history",85.5)));
a.insert(make_pair("Luce",lesson("math",99.0)));
map<string,lesson>::iterator it;
for(it=a.begin();it!=a.end();it++)
cout<<(*it).first<<" "<<(*it).second.first<<" "<<(*it).second.second<<endl;
return 0;
}
set集合容器实现了红黑树的平衡二叉树数据结构。在插入元素时它会自己主动调整二叉树的排列,把该元素放到适当的位置,而且
保证左右子树平衡。平衡二叉检索树採用中序遍历算法。
对于set,vector,map等等,它们的前向迭代器定义是这种(以set为例):
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++){}
那么反向迭代器呢?
set<int>::reverse_iterator rit;
for(rit=s.rbegin();rit!=s.rend();rit++){}
经常用法:insert(),erase(),find(),clear()
find()方法是查找元素方法。假设找到就返回该元素迭代器的位置,否则就返回最后一个元素后面的一个位置。
这样来使用:
it=s.find(5);
if(it!=s.end()) {}
else {}
关于比較函数:
假设元素不是结构体。而是基本数据类型,那么就自定义一个比較函数:
[cpp] view
plaincopy
struct cmp
{
bool operator()(const int &a,const int &b)
{
return a>b;
}
};
int main()
{
set<int,cmp> s;
for(int i=1;i<10;i++)
s.insert(i);
set<int,cmp>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" ";
return 0;
}
假设元素是结构体,那么比較函数直接能够写在结构体里面。
[cpp] view
plaincopy
struct Student
{
string name;
double score;
bool operator < (const Student &a) const
{
return a.score<score;
}
};
set<Student> s;
对于set容器来说。它不能有keyword同样的元素同一时候存在,假设要保留同样的元素,就用multiset多重集合容器。
其基本操作跟set集合容器几乎相同一样。定义方法是:multiset<string> ms;
map映照容器:
map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一相应关系。
map也是用红黑树实现
的。
同set一样,map不同意插入元素键值同样,而multimap多重应照集合能够同意键值反复。
用法:
[cpp] view
plaincopy
int main()
{
map<string,double> m;
m["Jack"]=98.0;
map<string,double>::iterator it;
for(it=m.begin();it!=m.end();it++)
cout<<(*it).first<<" "<<(*it).second<<endl;
return 0;
}
主要方法有:insert(),clear(),erase(),find()等等,基本跟set一样。对于multimap用法跟map几乎相同一样。
std::pair基本的作用是将两个数据组合成一个数据,两个数据能够是同一类型或者不同类型。
比如 std::pair<int,float> 或者 std::pair<double,double>等。
pair实质上是一个结构体。其基本的两个成员变量
是first和second。这两个变量能够直接使用。
初始化一个pair能够使用构造函数,也能够使用std::make_pair函数。
make_pair函数的定义例如以下:
[cpp] view
plaincopy
template pair make_pair(T1 a, T2 b)
{
return pair(a, b);
}
所以m.insert(pair<string,double>("Luce",88.5));
与 m.insert(make_pair("Luce",88.5)); 是相同的效果。
演示样例:
[cpp] view
plaincopy
int main()
{
typedef pair<string,double> lesson;
typedef multimap<string,lesson> stu;
stu a;
a.insert(make_pair("Jack",lesson("math",90.5)));
a.insert(make_pair("Jack",lesson("history",85.5)));
a.insert(make_pair("Luce",lesson("math",99.0)));
map<string,lesson>::iterator it;
for(it=a.begin();it!=a.end();it++)
cout<<(*it).first<<" "<<(*it).second.first<<" "<<(*it).second.second<<endl;
return 0;
}
相关文章推荐
- STL具体操作之set
- cocos2d-x3.0 解释具体的新的物理引擎setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()
- C++ STL之list具体解释
- STL 容器具体解释
- STL中间set具体用法!!!!
- 批处理中set截取字符具体解释
- 【算法导论-36】并查集(Disjoint Set)具体解释
- OSI七层模型具体解释
- STL—set
- oracle中imp命令具体解释
- ZOJ Problem Set - 3860Find the Spy (STL-> map 建立简单查询表 )
- Ubuntu安装一:VM安装具体解释
- Extjs4.10Model模型具体解释
- 如何使用set::key_comp 和 set::value_comp 标准模板库 (STL) 函数
- STL模板总结归纳(set,multiset和map,multimap)
- mount命令使用具体解释(Linux)
- javascript里的原型的具体解释
- 循环多少次? 【杭电--HDOJ-1799】 附题+具体解释
- STL系列之六 set与hash_set
- 【学习笔记】Hibernate映射List、Map、数组、Set、Bag的具体操作