概念:
set 容器 为集合;multiset 也是集合;插入数据时候默认按升序排列。
说明:
掌握常用set的操作,类比于自己实现 multiset的操作;
函数原型 | 功能 |
---|---|
set |
默认构造函数 |
set(const set &st) |
拷贝构造函数 |
set& operator=(const set &st) |
重载等号操作符 |
#include
void printSet(set<int> & s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//构造和赋值
void test01()
{ //默认构造
set<int> s1;
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
//输出结果: 10 20 30 40
// 插入set容器会自动排序
printSet(s1);
//拷贝构造
set<int>s2(s1);
//输出结果: 10 20 30 40
printSet(s2);
//赋值
set<int>s3;
s3 = s2;
//输出结果: 10 20 30 40
printSet(s3);
}
函数原型 | 功能 |
---|---|
size() |
容器中元素的数目 |
empty() |
判断容器是否为空 |
swap(st) |
交换两个集合容器 |
实例:
#include
void printSet(set<int> & s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//大小
void test01()
{
set<int> s1;
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
if (s1.empty())
{
cout << "s1为空" << endl;
}
else
{
cout << "s1不为空" << endl;
cout << "s1的大小为: " << s1.size() << endl;
}
}
//交换
void test02()
{
set<int> s1;
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
set<int> s2;
s2.insert(100);
s2.insert(300);
s2.insert(200);
s2.insert(400);
cout << "交换前" << endl;
printSet(s1);
printSet(s2);
cout << endl;
cout << "交换后" << endl;
s1.swap(s2);
printSet(s1);
printSet(s2);
}
函数原型 | 功能 |
---|---|
insert(elem) |
在容器中插入elem元素。 |
clear() |
清除所有元素 |
erase(pos) |
删除pos迭代器所指的元素, |
erase(beg, end) |
删除区间[beg,end)的所有元素 |
erase(elem) |
删除容器中值为elem的元素 |
注意:
实例:
#include
void printSet(set<int> & s)
{
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << endl;
}
//插入和删除
void test01()
{
set<int> s1;
//插入
s1.insert(10);
s1.insert(30);
s1.insert(20);
s1.insert(40);
//输出结果:10 20 30 40
printSet(s1);
//删除
s1.erase(s1.begin());
//输出结果: 20 30 40
printSet(s1);
s1.erase(30);
//输出结果: 20 40
printSet(s1);
//清空
//s1.erase(s1.begin(), s1.end());
s1.clear();
//输出结果:
printSet(s1);
}
自定义数据类型的插入
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 test02()
{ //创建容器时候,需要而外加入可对比的仿函数类型
set<Person, comparePerson> 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<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
{
cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
}
}
对组pair 概念:
当你需要返回两个数据时候可以用对组创建对象;
创建对组pair:
pair
;
pair
;
参数解释:
type 为 数据类型;value1 和 value2 为数据;
访问数据的方式:
p.first
:访问第一个 value1值;
p.second
: 访问第二 value2值;
实例:
void test01()
{
pair<string, int> p("tom", 10);
cout<<p.first<<endl;
cout << p.second << endl;
//传入匿名对象
pair<string, int> p1(string("tom"), 10);
cout << p1.first << endl;
cout << p1.second << endl;
pair<string, int> p2 = make_pair("jerry", 20);
cout << p2.first << endl;
cout << p2.second << endl;
}
概念:
map 里面的元素都是 pair 对组;
pair 对组中第一个为key值,索引,第二个为value 值;
map 容器的 key 值 不可以重复,而multimap 的可以;
map容器里面的元素都是按 key 键值排好顺序的;
优点:
map容器的优点就是,可以根据 key值快速找到 value值;
构造:
map
map(const map &mp); //拷贝构造函数
赋值:
map& operator=(const map &mp); //重载等号操作符
函数原型 | 功能 |
---|---|
map |
/map默认构造函数 |
map(const map &mp) |
拷贝构造函数 |
map& operator=(const map &mp) |
重载等号操作符 |
实例:
#include
void printMap(map<int,int>&m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{ //由于是每个元素是pair对组 ,所以通过迭代器访问时候通过这种方式访问
cout << "key = " << it->first << " value = " << it->second << endl;
}
cout << endl;
}
void test01()
{
map<int,int>m; //默认构造,由于里面的每隔二元素都是pair对组
//插入的元素pair(1, 10)为对组的匿名对象;
m.insert(pair<int, int>(1, 10));
m.insert(pair<int, int>(2, 20));
m.insert(pair<int, int>(3, 30));
printMap(m);
map<int, int>m2(m); //拷贝构造
printMap(m2);
map<int, int>m3;
m3 = m2; //赋值
printMap(m3);
}
函数原型 | 功能 |
---|---|
size() |
返回容器中元素的数目 |
empty() |
判断容器是否为空 |
swap(st) |
交换两个集合容器 |
操作和set容器一模一样;
函数原型 | 功能 |
---|---|
insert(elem) |
在容器中插入元素。 |
clear() |
清除所有元素 |
erase(pos) |
删除pos迭代器所指的元素 |
erase(beg, end) |
删除区间[beg,end)的所有元素 |
erase(key) |
删除容器中值为key的元素。 |
|
|
|
插入的elem 是对组,所以插入的方式比较多;记住一两种种就可以
实例:
#include
void printMap(map<int,int>&m)
{
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
cout << "key = " << it->first << " value = " << it->second << endl;
}
cout << endl;
}
void test01()
{
//插入
map<int, int> m;
//第一种插入方式,匿名对象方式
m.insert(pair<int, int>(1, 10));
//第二种插入方式
m.insert(make_pair(2, 20));
//第三种插入方式
m.insert(map<int, int>::value_type(3, 30));
//第四种插入方式
//插入键值为 4,值为40 的元素
m[4] = 40;
printMap(m);
//删除
m.erase(m.begin());
printMap(m);
m.erase(3);
printMap(m);
//清空
m.erase(m.begin(),m.end());
m.clear();
printMap(m);
}
注意:
虽然 map 支持[ ]中括号的方式插入元素,但是不建议用中括号的方式插入元素;一般用中括号方式访问数据。[key]得到key对应的数据;通常可以结合 find(key) 查找key的位置,就可以用[ ]的方式访问数据.