过分了家人们,是我列表里的谁,悄咪咪转行不说话,专业好友不到50,这是转了一半啊
SET / MUTISET容器
所有元素会在插入时被自动排序
属于关联式容器,底层结构式用二叉树实现
set 和 multiset 的区别
SET不允许容器中有重复的元素,MULTISET容许
2.1 构造和赋值
set<T> st;
set(const set &st)
set& operator=(const set &st)
#include<iostream>
using namespace std;
#include<set>
/*
set<T> st;
set(const set &st)
set& operator=(const set &st)
*/
void prints(set<int>& s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void prints(multiset<int>& s) {for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void t01() {set<int>s1;s1.insert(89);//插入数据唯一方式s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);set<int>s2(s1);prints(s2);set<int>s3;s3 = s2;prints(s3);
}
void t02() {multiset<int>s1;s1.insert(89);//插入数据唯一方式s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);multiset<int>s2(s1);prints(s2);multiset<int>s3;s3 = s2;prints(s3);
}
int main() {t01();t02();system("pause");return 0;
}
2.2 大小和交换
size() empty() swap()
因为SET不允许有重复的值,所以不能重新指定大小
#include<iostream>
using namespace std;
#include<set>
/*
size()
empty()
swap()
*/
void prints(set<int>& s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void prints(multiset<int>& s) {for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
template <class T>
void iskong(T &s) {if (s.empty()) {cout << " kong " << endl;}else {cout << "size: " << s.size() << endl;}
}
void t01() {set<int>s1;iskong(s1);s1.insert(89);//插入数据唯一方式s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);iskong(s1);prints(s1);set<int>s2;s2.insert(0);iskong(s2);prints(s2);cout << "_______________________" << endl;s1.swap(s2);iskong(s1);prints(s1);iskong(s2);prints(s2);cout << "_______________________" << endl;cout << "_______________________" << endl;
}
void t02() {multiset<int>s1;iskong(s1);s1.insert(89);s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);multiset<int>s2;s2.insert(3);//(3,4)不行prints(s2);cout << "_______________________" << endl;s1.swap(s2);iskong(s1);prints(s1);iskong(s2);prints(s2);
}
int main() {t01();t02();system("pause");return 0;
}
2.3 插入和删除
insert()
clear()
erase(pos)
erase(beg,end)
srase(elem)
#include<iostream>
using namespace std;
#include<set>
/*
insert()
clear()
erase(pos)
erase(beg,end)
srase(elem)
*/
void prints(set<int>& s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void prints(multiset<int>& s) {for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
template <class T>
void iskong(T &s) {if (s.empty()) {cout << " kong " << endl;}else {cout << "size: " << s.size() << endl;}
}
void t01() {set<int>s1;iskong(s1);s1.insert(89);//插入数据唯一方式s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);set<int>::iterator it = s1.begin();s1.erase(it);prints(s1);//it++;//s1.erase(it);it = s1.begin(); it++; it++; //IT不能连续使用,要重新赋值IT,不懂s1.erase(it);prints(s1);s1.erase(45);prints(s1);s1.clear();iskong(s1);cout << "_______________________" << endl;
}
void t02() {multiset<int>s1;iskong(s1);s1.insert(89);s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);s1.erase(89);prints(s1);s1.erase(s1.begin());prints(s1);s1.erase(s1.begin(),s1.end());iskong(s1);
}
int main() {t01();t02();system("pause");return 0;
}
2.4 查找和统计
find(key)//存在,返回该元素的迭代器,不存在,返回SET.END()
count(key) //统计个数
#include<iostream>
using namespace std;
#include<set>
/*
find(key)//存在,返回该元素的迭代器,不存在,返回SET.END()
count(key) //统计个数
*/
void prints(set<int>& s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void prints(multiset<int>& s) {for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
template <class T>
void iskong(T &s) {if (s.empty()) {cout << " kong " << endl;}else {cout << "size: " << s.size() << endl;}
}
void t01() {set<int>s1;iskong(s1);s1.insert(89);//插入数据唯一方式s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);set<int>::iterator it ;it = s1.find(66);//查找不存在的数,查找不报错,查找之后打印报错it--;cout << *it << endl;//迭代器指的是间隙!if(it==s1.end()){^^^^^}it = s1.find(3);cout << *it << endl;int num = s1.count(30);cout << " num=" << num << endl;num = s1.count(3);cout << " num=" << num << endl;//对于SET只有0 和 1cout << "_______________________" << endl;
}
void t02() {multiset<int>s1;iskong(s1);s1.insert(89);s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);int num = s1.count(89);cout << " num=" << num << endl;
}
int main() {t01();t02();system("pause");return 0;
}
2.5 SET和MULTISET的区别
SET不允许容器中有重复的元素,MULTISET容许
SET插入数据的同时会返回插入结果,表示插入是否成功,MULTISET不会检测数据,因此可以插入重复数据
#include<iostream>
using namespace std;
#include<set>
/*
find(key)//存在,返回该元素的迭代器,不存在,返回SET.END()
count(key) //统计个数
*/
void prints(set<int>& s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void prints(multiset<int>& s) {for (multiset<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
template <class T>
void iskong(T &s) {if (s.empty()) {cout << " kong " << endl;}else {cout << "size: " << s.size() << endl;}
}
void t01() {set<int>s1;iskong(s1);// store a pair of values 存储一对值pair<set<int>::iterator ,bool>ret= s1.insert(89);if (ret.second) {//第二个数据cout << "cha ru cheng gong" << endl;}else {cout << "damn" << endl;}prints(s1);ret = s1.insert(89);if (ret.second) {//第二个数据cout << "cha ru cheng gong" << endl;}else {cout << "damn" << endl;}prints(s1);cout << "_______________________" << endl;
}
void t02() {multiset<int>s1;iskong(s1);s1.insert(89);//返回一个迭代器iterators1.insert(89);prints(s1);
}
int main() {t01();t02();system("pause");return 0;
}
2.6 PAIR使用-PAIR对组的创建
成对出现的数据,利用对组可以返回两个数据
pair<type ,type> p (value1,value2)
pair<type ,type> p=make_pair (value1,value2)
#include<iostream>
using namespace std;
#include<set>
/*
pair<type ,type> p (value1,value2)
pair<type ,type> p=make_pair (value1,value2)
*/void t01() {pair<string, int>p("哈哈哈", 78);cout << "xingming :" << p.first << "\tage:" << p.second << endl;pair<string, int>p2 = make_pair("hi i经济", 0);cout << "xingming :" << p2.first << "\tage:" << p2.second << endl;cout << "_______________________" << endl;
}
void t02() {}
int main() {t01();t02();system("pause");return 0;
}
2.7 内置类型指定排序规则
SET默认排序小 -> 大,利用仿函数改变排序规则
#include<iostream>
using namespace std;
#include<set>
class mycompare
{
public:bool operator()(int v1,int v2)const {//第一个重载的符号,第二个参数列表return v1 > v2;}
};//什么加了CONST可以被CONST和非CONST对象调用,不加的只能被非CONST对象调用
//加了表示成员函数隐含传入的THIS指针是CONST指针
void prints(set<int>& s) {for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void prints(set<int,mycompare>& s) {for (set<int, mycompare>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}
void t01() {set<int>s1;s1.insert(89);s1.insert(9090);s1.insert(45);s1.insert(12);s1.insert(3);prints(s1);//插入数据之前就要限定排序规则set<int,mycompare>s2;s2.insert(89);s2.insert(9090);s2.insert(45);s2.insert(12);s2.insert(3);prints(s2);
}
void t02() {}
int main() {t01();t02();system("pause");return 0;
}
2.8 自定义数据类型指定排序规则
自定义数据类型都会直接指定排序规则
#include<iostream>
#include<string>
using namespace std;
#include<set>class Person {
public:Person(string name, int a) {this->_name = name;this->_age = a;}
public:string _name;int _age;
};
class mycompare
{
public:bool operator()(Person v1, Person v2)const {//第一个重载的符号,第二个参数列表return v1._age > v2._age;}
};
void setpp2(set<Person, mycompare>& l) {srand((unsigned int)time(NULL));string nameseed = "abcde";for (int i = 0; i < 5; i++) {string name = "选手";name += nameseed[i];int age = rand() % 21 + 20;Person p(name, age);l.insert(p);}
}void prints(set<Person,mycompare>& s) {for (set<Person, mycompare>::iterator it = s.begin(); it != s.end(); it++) {cout << it->_name << " " << it->_age << endl;}cout << endl;
}
void t01() {}
void t02() {//插入数据之前就要限定排序规则set<Person, mycompare>s2;setpp2(s2);prints(s2);
}
int main() {t01();t02();system("pause");return 0;
}
MAP容器
MAP中所有元素都是PAIR;PAIR的第一个元素为KEY(键值),起到索引作用,第二个元素为VALUE(实值 )
所有元素都会根据元素的键值自动排序
MAP / MULTIMAP属于关联式容器,底层结构是二叉树实现的
区别:MAP不允许容器中有重复KEY元素,MULTIMAP允许
优点:可以根据KEY值快速找到VALUE值,高效率,高性能
2.1 构造和赋值
map<T1,T2> mp
map(const map &mp)
map& operator=(const map &mp)
#include<iostream>
#include<string>
using namespace std;
#include<map>
/*
map<T1,T2> mp
map(const map &mp)
map& operator=(const map &mp)
*/void prints(map<int,string>& s) {for (map<int,string>::iterator it = s.begin(); it != s.end(); it++) {cout << " " << (*it).first << " " <<it->second<< endl;}cout << endl;
}
void t01() {}
void t02() {map<int, string>m;m.insert(pair<int, string>(45, "sefw"));prints(m);map<int, string>m1(m);prints(m1);map<int, string>m2;m2 = m;prints(m2);
}
int main() {t01();t02();system("pause");return 0;
}
2.2 大小和交换
size() empty() swap()
#include<iostream>
#include<string>
using namespace std;
#include<map>
/*
size() empty() swap()
*/void prints(map<int,string>& s) {for (map<int,string>::iterator it = s.begin(); it != s.end(); it++) {cout << " " << (*it).first << " " <<it->second<< endl;}
}
void iskong(map<int,string> &z) {if (z.empty()) {cout << " kkong " << endl;}else {cout << " no no no no no/// size:" <<z.size()<< endl;}
}
void t01() {}
void t02() {map<int, string>m;iskong(m);m.insert(pair<int, string>(45, "sefw"));prints(m);iskong(m);map<int, string>m1(m);m1.insert(pair<int, string>(78, "计划科"));prints(m1);iskong(m1);cout << "_______________________" << endl;m1.swap(m);prints(m);iskong(m);prints(m1);iskong(m1);
}
int main() {t01();t02();system("pause");return 0;
}
2.3 插入和删除
insert(elem) //不建议用中括号,直接可能会创造一半的东西
m1.insert(pair<int, string>(78, "计划科"));
m1.insert(make_pair(99, "的深刻思考的"));
m.insert(map<int, string>::value_type(45, "sefw"));
clear() erase(pos) erase(beg,end) srase(key)
#include<iostream>
#include<string>
using namespace std;
#include<map>
/*
insert(elem)
clear()
erase(pos)返回下一个元素的迭代器
erase(beg,end)返回下一个元素的迭代器
srase(key)
*/void prints(map<int,string>& s) {for (map<int,string>::iterator it = s.begin(); it != s.end(); it++) {cout << " " << (*it).first << " " <<it->second<< endl;}cout << endl;
}
void iskong(map<int,string> &z) {if (z.empty()) {cout << " kkong " << endl;}else {cout << " no no no no no/// size:" <<z.size()<< endl;}
}
void t01() {}
void t02() {map<int, string>m;iskong(m);m.insert(map<int, string>::value_type(45, "sefw")); //03prints(m);iskong(m);map<int, string>m1(m);m1.insert(pair<int, string>(78, "计划科")); //01m1.insert(make_pair(99, "的深刻思考的")); //02prints(m1);iskong(m1);cout << "_______________________" << endl;m1.erase(m1.begin());prints(m1);m1[3]= (89, "sefw"); //04prints(m1);map<int, string>::iterator it = m1.begin();it++;m1.erase(it);prints(m1);cout << " " << m1[3] << endl;//不建议用第四种创建办法,无中生有!!!prints(m1); cout << " " << m1[2] << endl;//打印不出来//cout << " " << (*it).first << " " << it->second << endl;/*it--;m1.erase(it);prints(m1);*/m1.erase(m1.begin());m1.erase(3);prints(m1);
}
int main() {t01();t02();system("pause");return 0;
}
2.4 查找和统计
find(key)//存在,返回该元素的迭代器,不存在,返回SET.END()
count(key) //统计个数
#include<iostream>
#include<string>
using namespace std;
#include<map>
/*
find(key)//存在,返回该元素的迭代器,不存在,返回SET.END()
count(key) //统计个数
*/void prints(map<int,string>& s) {for (map<int,string>::iterator it = s.begin(); it != s.end(); it++) {cout << " " << (*it).first << " " <<it->second<< endl;}cout << endl;
}
void t01() {multimap<int, string>m;m.insert(make_pair(3, "dd"));m.insert(make_pair(3, "76343f"));cout << m.count(3) << endl;cout << m.count(8) << endl;
}
void t02() {map<int, string>m;m.insert(make_pair(1,"iuh"));m.insert(make_pair(2, "dd"));m.insert(make_pair(3, "76343f"));m.insert(make_pair(4, "ddddddd"));prints(m);map<int, string>::iterator it = m.find(3);//返回迭代器if (it != m.end()) {cout << " find " << endl;cout<< " " << (*it).first << " " << it->second << endl;}else {cout << "no no no " << endl;}cout<< m.count(3)<<endl;cout << m.count(8) << endl;
}
int main() {t01();t02();system("pause");return 0;
}
2.5 排序
默认排序小 -> 大,利用仿函数改变排序规则
#include<iostream>
#include<string>
using namespace std;
#include<map>
class mycompare {
public:bool operator()(int v1, int v2)const {return v1 > v2;}
};
void prints(map<int,string>& s) {for (map<int,string>::iterator it = s.begin(); it != s.end(); it++) {cout << " " << (*it).first << " " <<it->second<< endl;}cout << endl;
}
void prints(map<int, string, mycompare>& s) {for (map<int, string, mycompare>::iterator it = s.begin(); it != s.end(); it++) {cout << " " << (*it).first << " " << it->second << endl;}cout << endl;
}
void t01() {}
void t02() {map<int, string>m;m.insert(make_pair(1,"iuh"));m.insert(make_pair(2, "dd"));m.insert(make_pair(3, "76343f"));m.insert(make_pair(4, "ddddddd"));prints(m);map<int, string,mycompare>m1;m1.insert(make_pair(1, "iuh"));m1.insert(make_pair(2, "dd"));m1.insert(make_pair(3, "76343f"));m1.insert(make_pair(4, "ddddddd"));prints(m1);
}
int main() {t01();t02();system("pause");return 0;
}