目录
一、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;//10cout << "Second element: " << myPair.second << endl;//3.14return 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 9return 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 13set<int>::iterator itlow = s.lower_bound(7);//>= val值位置的iteratorset<int>::iterator itup = s.upper_bound(11);//> val值位置的iteratorcout << "*itlow: " << *itlow << " *itup: " << *itup << endl;//7 12s.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;//4cout << *(range.second) << endl;//5
}
int main()
{test();return 0;
}
三、multiset
(一)介绍
template < class T, // multiset::key_type/value_typeclass Compare = less<T>, // multiset::key_compare/value_compareclass 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 11multiset<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 11size_t n =s.erase(2);print(s);//1 5 6 7 8 11cout << 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 11pair<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 11cout << "2出现次数:"<<s.count(2) << endl;//3
}
int main()
{test();return 0;
}
四、map
- map是kv型数据结构
(一)map的模板参数列表
template < class Key, // map::key_typeclass T, // map::mapped_typeclass Compare = less<Key>, // map::key_compareclass 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", "排序"));//插入匿名对象pairdict.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;
}