set和multiset区别:
set s;//创建一个int型的set集合
s.insert(1); // 返回插入的位置和插入成功与否(返回pair类型)
s.insert(8);
s.insert(3);
s.insert(1);//因为前面插入了1,所以这行代码会被忽略
//构造:
set s1; //默认构造函数:
set s2(s1); //拷贝构造函数//赋值:
s3 = s2; //重载等号操作符
总结:
set容器插入数据时用 s1.insert();#include void printSet(set & s)
{for (set::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}cout << endl;
}//set容器构造和赋值
void test01()
{set s1;s1.insert(10);s1.insert(30);s1.insert(30);s1.insert(20);s1.insert(40);//set容器特点 ,所有元素插入自动排序//set不允许插入重复的值printSet(s1);//拷贝构造sets2(s1);printSet(s2);//赋值sets3;s3 = s2;printSet(s3);
}int main()
{test01();system("pause");return 0;
}
s1.size() //返回容器中元素的数目
s1.empty() //判断容器是否为空
s1.swap(s2); //交换两个集合容器size//s1.resize(); //不能指定大小
s1.insert(10); //在容器中插入元素,返回 pair 类型s1.erase(s1.begin()); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
s1.erase(s1.begin(), s1.end()); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
s1.erase(30); //删除容器中值为30的元素。s1.clear(); //清除所有元素
//查找30是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
pos = s1.find(30);//统计30的元素个数,对于set而言 统计结果 要么是0 要么是1
int num = s1.count(30); //set不允许容器中有重复的元素
pair::iterator, bool> ret = s.insert(10); //返回插入成功与否
//set插入数据的同时会返回插入结果bool值,表示插入是否成功
//若有重复元素表示插入不成功
pair::iterator, bool> ret = s.insert(10); //set会检测数据,返回键值对(1.插入位置,2.成功与否)
ret.first();
ret.second();
//set和multiset区别
void test01()
{set s;pair::iterator, bool> ret = s.insert(10);if (ret.second) {cout << "第一次插入成功!" << endl;}else {cout << "第一次插入失败!" << endl;}ret = s.insert(10);if (ret.second) {cout << "第二次插入成功!" << endl;}else {cout << "第二次插入失败!" << endl;}//multiset//允许插入重复值multiset ms;ms.insert(10);ms.insert(10);for (multiset::iterator it = ms.begin(); it != ms.end(); it++) {cout << *it << " ";}cout << endl;
}int main() {test01();system("pause");return 0;
}
//pair初始化
pair p("Tom", 20);
pair p2;
p2 = make_pair("Jerry", 30); p.first = "xue";
p.second = 25;
p.swap(p2); //交换两个对组
priority_queue,vector>,greater>>pq;
1.pq.top().first;
2.pq.top().second;
set s1; //默认排序从小到大 (开头是小)
//等价set >set > //排序从大到小(开头是大)
set s2; //利用仿函数MyCompare,可以改变排序规则
//对于自定义数据类型Person,set必须指定排序规则comparePerson才可以插入数据
set s;
class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;};
class comparePerson
{
public:bool operator()(const Person& p1, const Person &p2){//按照年龄进行排序 降序return p1.m_Age > p2.m_Age;}
};void test01()
{set s;Person p1("刘备", 23);Person p2("关羽", 27);Person p3("张飞", 25);Person p4("赵云", 21);s.insert(p1);s.insert(p2);s.insert(p3);s.insert(p4);for (set::iterator it = s.begin(); it != s.end(); it++){cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;}
}
int main() {test01();system("pause");return 0;
}
//哈希解法
class Solution {
public:int singleNumber(vector& nums) {unordered_map hash_map; //哈希表for(int i=0; ihash_map[nums[i]]++; //实值累加,默认实值为0}//for(unordered_map::iterator it=m.begin();it!=m.end();it++)for(auto it : hash_map) //it不是迭代器{if(it.second == 1)return it.first; }return 0;}
};
本质:
map和multimap区别:
构造:
//初始化
map m;
m["def"]; //默认初始化为{def,0} map m; //默认构造
map m2(m); //拷贝构造
赋值:
m3 = m2; //重载等号操作符
#include
m.size() //返回容器中元素的数目
m.empty() //判断容器是否为空
m.swap(m2); //交换两个集合容器m.insert(pair(1, 10)); //插入数据
m.insert(make_pair(2, 20));
m.insert(map::value_type(3, 30));m[4] = 40; //[]不建议插入用途,可以利用key访问到value
//pair初始化
pair p("Tom", 20);
pair p2 = make_pair("Jerry", 30);m.insert(pair(1, 10)); //在容器中插入元素。
m.insert(make_pair(2, 20));
m.insert(map::value_type(3, 30));
m[4] = 40; //[]不建议插入用途,可以利用key访问到valuem.erase(m.begin()); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
m.erase(m.begin(), m.end()); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
m.erase(3); //按照键值(key)3删除
m.clear(); //清除所有元素
pos = m.find(3) //查找键值key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回m.end();int num = m.count(3) //统计键值key的元素个数
map m; //利用仿函数MyCompare实现从大到小排序map s; //对于自定义数据类型,map必须要指定排序规则,同set容器
class MyCompare {
public:bool operator()(int v1, int v2) {//降序return v1 > v2;}
};//map容器的排序
void test01()
{//默认从小到大排序//利用仿函数实现从大到小排序map m;m.insert(make_pair(1, 10));m.insert(make_pair(2, 20));m.insert(make_pair(3, 30));m.insert(make_pair(4, 40));m.insert(make_pair(5, 50));for (map::iterator it = m.begin(); it != m.end(); it++) {cout << "key:" << it->first << " value:" << it->second << endl;}
}
int main() {test01();system("pause");return 0;
}