day17 周末两天偷懒没更新,今天炼丹加学习,完结STL常用容器部分
还剩下两个常用容器,一个是set(集合容器) , 一个是map容器
set/multiset 容器
set容器是关联式容器,该容器的特点是:所有元素都会在插入时被自动排序
set/multiset 都是关联式容器 ,其底层结构是使用二叉树实现的。
二者的区别是:set不允许容器中有重复的元素 , multiset允许容器中有重复的元素。
构造 :默认构造和拷贝构造 重载operator=
插入数据的时候没有push 只有insert。
现在来写写特殊的情况,一般的set中默认的是升序排列,下列这段代码第一次打印的时候显示的是 2,5,10,18,如果我想让其降序排列呢,那么还是按照之前的思路,构造一个仿函数即可。仿函数的本质其实是一个类。
class compare
{
public:
bool operator()(int v1 , int v2)const // 需要加入const . 关键字表示 该操作符不会修改类的成员变量,确保 operator() 方法在对象内部是只读的。
{
return v1 > v2;
}
};
void printinfo(set<int,compare> &s)
{
for(set<int,compare>::iterator it = s.begin() ; it != s.end() ; it++)
{
cout << *it << " ";
}
cout << endl;
}
void test01()
{
set<int>s1;
s1.insert(10);
s1.insert(5);
s1.insert(18);
s1.insert(2);
printinfo(s1);
set<int , compare>s2 ;
s2.insert(10);
s2.insert(5);
s2.insert(18);
s2.insert(2);
}
int main()
{
test01();
system("pause");
return 0 ;
}
还学习了如何创建队组
队组: 成对出现的数据 , 利用队组可以放回两个数据
创建方式 pair<type , type> p (value1 , value2);
pair<type , type> p = make_pair(value1 , value2);
总结:对于自定义数据类型 set必须指定排序规则才可以插入数据
map/multimap容器
map中所有元素都是pair pair中第一个元素是key(键值),起到索引作用 第二个元素是value(实值)。
所有元素会根据元素的键值自动排序 从小到大 。
map/multimap关联式容器,二叉树实现。
优点:可以快速根据key找到value。
map中不允许有重复key值的元素 multimap可以有。
使用率仅次与vector list。
构造赋值同set 插入数据的时候一定要使用队组。
使用:size empty swap find count
void printinfo(map<int, int> &m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << it->first << " " ;
cout << (*it).second << " "<<endl;
}
cout << endl;
}
void test01()
{
map<int, int>m1;
//第一种
m1.insert(make_pair(2, 2));
//第二种
m1.insert(pair<int , int>(1,10));
m1.insert(pair<int, int>(45, 4));
m1.insert(pair<int, int>(5, 6));
m1.insert(pair<int, int>(9, 3));
//第三种 不推荐
m1.insert(map<int, int>::value_type(3, 30));
//第四种 不推荐 如果要输出 cout<<m1[5]<< endl ; 他会先创建一个key为5 value为0的元素
//[]不建议插数 用途使用key访问到value
m1[6] = 32;
printinfo(m1);
}