目录
一、pair和make_pair
1. pair
2. make_pair
二、set
(一)set的模板参数列表
(二)set的构造
(三)set的插入
1. 测试1
2. 测试2
(四)low_bound和upper_bound(上/下边界)
(五)查找指定元素的范围(区间)
三、multiset
(一)介绍
(二)查找find
(三)删除erase
(四)查找特定值的范围(equal_range)
(五)计算指定值出现次数count
四、map
(一)map的模板参数列表
(二)插入insert
(三)operator[]
(四)统计次数
1. 方式一
2. 方式二
一、pair和make_pair
1. pair
template <class T1, class T2> struct pair;
- 可以容纳两个不同类型的值。它通常用于将两个值组合在一起,使得它们可以作为一个单元来处理
2. make_pair
make_pair
是一个函数模板,可以让编译器根据参数自动确定类型
template <class T1, class T2>
pair<T1,T2> make_pair (T1 x, T2 y);
#include <iostream>
using namespace std;
int main() {
int x = 10;
double y = 3.14;
pair<int, double> myPair = make_pair(x, y);
cout << "First element: " << myPair.first << endl;//10
cout << "Second element: " << myPair.second << endl;//3.14
return 0;
}
二、set
- set是key搜索模型容器,判断在不在
- set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
- set中插入元素时,只需要插入value即可,不需要构造键值对。
- set中的元素不可以重复(因此可以使用set进行去重)。
(一)set的模板参数列表
(二)set的构造
(三)set的插入
pair<iterator,bool> insert (const value_type& val);
iterator insert (iterator position, const value_type& val);
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
1. 测试1
#include<iostream>
#include<set>
using namespace std;
void test1()
{
set<int>s;
s.insert(1);
s.insert(9);
s.insert(4);
s.insert(7);
s.insert(3);
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
int main()
{
test1();//1 3 4 7 9
return 0;
}
2. 测试2
#include<iostream>
#include<set>
using namespace std;
void test1()
{
set<int>s;
s.insert(1);
s.insert(9);
s.insert(4);
s.insert(7);
s.insert(3);
pair<set<int>::iterator, bool> ret = s.insert(7);
cout << ret.second << endl;
}
int main()
{
test1();//0,表示插入7失败了
return 0;
}
(四)low_bound和upper_bound(上/下边界)
iterator lower_bound (const value_type& val) const;//返回大于等于val值位置的iterator
iterator upper_bound (const value_type& val) const;//返回大于val值位置的iterator
#include<iostream>
#include<set>
using namespace std;
void print(const set<int>& s)
{
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void test()
{
set<int> s;
for (int i = 0; i < 10; i++)
{
s.insert(i + 4);
}
print(s);//4 5 6 7 8 9 10 11 12 13
set<int>::iterator itlow = s.lower_bound(7);//>= val值位置的iterator
set<int>::iterator itup = s.upper_bound(11);//> val值位置的iterator
cout << "*itlow: " << *itlow << " *itup: " << *itup << endl;//7 12
s.erase(itlow, itup);
print(s);//4 5 6 12 13
}
int main()
{
test();
return 0;
}
(五)查找指定元素的范围(区间)
pair<iterator,iterator> equal_range (const value_type& val) const;
- 返回两个迭代器,表示指定元素在集合中的范围。第1个迭代器指向第1个等于指定元素的位置,第2个迭代器指向第1个大于指定元素的位置。
#include<iostream>
#include<set>
using namespace std;
void test()
{
set<int> mySet = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
pair<set<int>::iterator,set<int>::iterator> range = mySet.equal_range(4);
cout << *(range.first) << endl;//4
cout << *(range.second) << endl;//5
}
int main()
{
test();
return 0;
}
三、multiset
(一)介绍
template < class T, // multiset::key_type/value_type
class Compare = less<T>, // multiset::key_compare/value_compare
class Alloc = allocator<T> > // multiset::allocator_type
> class multiset;
- multiset是按照特定顺序存储元素的容器,其中元素是可以重复的
- 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T). multiset元素的值不能在容器中进行修改(因为元素总是const的),但可以从容器中插入或删除
(二)查找find
- 如果有多个相同的val,find返回中序第一个val
iterator find (const value_type& val) const;
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void test()
{
multiset<int>s;
s.insert(1);
s.insert(6);
s.insert(2);
s.insert(2);
s.insert(2);
s.insert(8);
s.insert(7);
s.insert(5);
s.insert(11);
print(s);// 1 2 2 2 5 6 7 8 11
multiset<int> ::iterator it = s.find(2);
while (it != s.end())
{
cout << *it << " ";
it++;
}
//2 2 2 5 6 7 8 11
}
int main()
{
test();
return 0;
}
(三)删除erase
void erase (iterator position);
size_type erase (const value_type& val);//删除所有等于 key 的元素,并返回删除的元素数量。
void erase (iterator first, iterator last);
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void test()
{
multiset<int>s;
s.insert(1);
s.insert(6);
s.insert(2);
s.insert(2);
s.insert(2);
s.insert(8);
s.insert(7);
s.insert(5);
s.insert(11);
print(s);// 1 2 2 2 5 6 7 8 11
size_t n =s.erase(2);
print(s);//1 5 6 7 8 11
cout << n;//3(删除2的数量为3)
}
int main()
{
test();
return 0;
}
(四)查找特定值的范围(equal_range)
pair<iterator,iterator> equal_range (const value_type& val) const;
- 利用删除所有2,利用equal_range,找到一个范围,然后利用erase
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void test()
{
multiset<int>s;
s.insert(1);
s.insert(6);
s.insert(2);
s.insert(2);
s.insert(2);
s.insert(8);
s.insert(7);
s.insert(5);
s.insert(11);
print(s);// 1 2 2 2 5 6 7 8 11
pair<set<int>::iterator, set<int>::iterator> ret = s.equal_range(2);
s.erase(ret.first, ret.second);
print(s);//1 5 6 7 8 11
}
int main()
{
test();
return 0;
}
(五)计算指定值出现次数count
size_type count (const value_type& val) const;
#include<iostream>
#include<set>
using namespace std;
void print(const multiset<int>& s)
{
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
void test()
{
multiset<int>s;
s.insert(1);
s.insert(6);
s.insert(2);
s.insert(2);
s.insert(2);
s.insert(8);
s.insert(7);
s.insert(5);
s.insert(11);
print(s);// 1 2 2 2 5 6 7 8 11
cout << "2出现次数:"<<s.count(2) << endl;//3
}
int main()
{
test();
return 0;
}
四、map
- map是kv型数据结构
(一)map的模板参数列表
template < class Key, // map::key_type
class T, // map::mapped_type
class Compare = less<Key>, // map::key_compare
class Alloc = allocator<pair<const Key,T> > // map::allocator_type
> class map;
- key:键值对中key的类型
- T: 键值对中value的类型
- Compare:比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型),需要用户自己显式传递比较规则(一般情况下按照函数指针或者仿函数来传递)
- Alloc:通过空间配置器来申请底层空间,不需要用户传递,除非用户不想使用标准库提供的
- 空间配置器
(二)插入insert
pair<iterator,bool> insert (const value_type& val);
iterator insert (iterator position, const value_type& val);
template <class InputIterator>
void insert (InputIterator first, InputIterator last);
#include<iostream>
#include<map>
using namespace std;
void print(map<string,string> m)
{
map<string, string>::iterator it = m.begin();
while (it != m.end())
{
cout << (*it).first << ": " << (*it).second << endl;
it++;
}
cout << endl;
}
void test()
{
map<string, string> dict;
dict.insert(pair<string, string>("sort", "排序"));//插入匿名对象pair
dict.insert(pair<string, string>("insert", "插入"));
dict.insert(pair<string, string>("left", "左边"));
dict.insert(make_pair("right", "右边")); // 自动堆导类型
print(dict);
}
int main()
{
test();
return 0;
}
(三)operator[]
mapped_type& operator[] (const key_type& k);//k 是要访问或插入的键值对的键
#include<iostream>
#include<map>
using namespace std;
void print(map<string,string> m)
{
map<string, string>::iterator it = m.begin();
while (it != m.end())
{
//cout << (*it).first << ": " << (*it).second << endl;
cout << it->first << ": " << it->second << endl;
it++;
}
cout << endl;
}
void test()
{
map<string, string> dict;
dict.insert(pair<string, string>("insert", "插入"));
dict.insert(pair<string, string>("left", "左边"));
dict["erase"]; // 插入
cout << dict["erase"] << endl; // 查找
dict["erase"] = "删除"; // 修改
cout << dict["erase"] << endl;// 查找
dict["test"] = "测试"; // 插入键值对
dict["left"] = "左边、剩余"; // 修改
print(dict);
}
int main()
{
test();
return 0;
}
(四)统计次数
1. 方式一
void test()
{
string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
map<string, int> countMap;
for (auto& str : arr)
{
auto ret = countMap.find(str);
if (ret == countMap.end())
{
// 没有表示第一次出现,插入
countMap.insert(make_pair(str, 1));
}
else
{
// 次数++
ret->second++;
}
countMap[str]++;
}
print(countMap);
}
2. 方式二
#include<iostream>
#include<map>
using namespace std;
void print(map<string, int> m)
{
map<string, int>::iterator it = m.begin();
while (it != m.end())
{
//cout << (*it).first << ": " << (*it).second << endl;
cout << it->first << ": " << it->second << endl;
it++;
}
cout << endl;
}
void test()
{
string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
map<string, int> countMap;
for (auto& str : arr)
{
countMap[str]++;//因为map容器中第1个成员不能修改,第2个成员可以修改
}
print(countMap);
}
int main()
{
test();
return 0;
}