//键值对定义
template <class T1, class T2>
struct pair
{
typedef T1 first_type;
typedef T2 second_type;
T1 first;
T2 second;
pair(): first(T1()), second(T2())
{}
pair(const T1& a, const T2& b): first(a), second(b)
{}
};
template < class T, // set::key_type/value_type
class Compare = less<T>, // set::key_compare/value_compare
class Alloc = allocator<T> // set::allocator_type
> class set;
函数声明 | 功能说明 |
---|---|
set (const Compare& comp = Compare(), const Allocator&= Allocator() ); | 构造空的set |
set ( InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& =Allocator() ); | 用[first, last)区间中的元素构造set |
set ( const set<Key,Compare,Allocator>& x); | set的拷贝构造 |
//用[first, last)区间中的元素构造set
// 用数组array中的元素构造set
int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
set<int> s(array, array+sizeof(array)/sizeof(array));
函数声明 | 功能说明 |
---|---|
bool empty ( ) const | 检测set是否为空,空返回true,否则返回true |
size_type size() const | 返回set中有效元素的个数 |
函数声明 | 功能说明 |
---|---|
pair<iterator,bool> insert (const value_type& x ) | 在set中插入元素x,实际插入的是<x, x>构成的键值对,如果插入成功,返回<该元素在set中的位置,true>,如果插入失败,说明x在set中已经存在,返回<x在set中的位置,false> |
void erase ( iterator position ) | 删除set中position位置上的元素 |
size_type erase ( constkey_type& x ) | 删除set中值为x的元素,返回删除的元素的个数 |
void erase ( iterator first,iterator last ) | 删除set中[first, last)区间中的元素 |
void swap (set<Key,Compare,Allocator>&st ); | 交换set中的元素 |
void clear ( ) | 将set中的元素清空 |
iterator find ( const key_type& x ) const | 返回set中值为x的元素的位置 |
size_type count ( const key_type& x ) const | 返回set中值为x的元素的个数 |
pair<iterator,iterator> equal_range (const value_type& val) const; | 这个equal_range函数用于在序列中表示一个数值的第一次出现与最后一次出现的后一位。得到相等元素的子范围(然而set天然去重,这个在mutiset中有用) |
// 排序+去重
set<int> s;
s.insert(3);
s.insert(5);
s.insert(8);
s.insert(7);
if (s.find(5) != s.end())
{
cout << "找到了" << endl;
}
if (s.count(5))//更加常用
{
cout << "找到了" << endl;
}
//利用迭代器增删查改一段区间内的元素
std::set<int> myset;
std::set<int>::iterator itlow, itup;
for (int i = 1; i < 10; i++)
myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90
myset.insert(35);
// 删除[30 60]
itlow = myset.lower_bound(30); // >=
itup = myset.upper_bound(60); // >
// [itlow, itup)
cout << *itlow << endl;
cout << *itup << endl;
myset.erase(itlow, itup); // 10 20 70 80 90
for (auto e : myset)
{
cout << e << " ";
}
cout << endl;
代码演示:
#include<iostream>
#include <set>
using namespace std;
void test_set1()
{
// 用数组array中的元素构造set
int array[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0, 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
set<int> s(array, array+sizeof(array)/sizeof(array));
// 正向打印set中的元素,从打印结果中可以看出:set可去重
for (auto& e : s)
cout << e << " ";
cout << endl;
// 使用迭代器逆向打印set中的元素
for (auto it = s.rbegin(); it != s.rend(); ++it)
cout << *it << " ";
cout << endl;
// set中值为3的元素出现了几次
cout << s.count(3) << endl;
}
void test_set2()
{
// 排序
multiset<int> s;
s.insert(3);
s.insert(5);
s.insert(8);
s.insert(7);
s.insert(7);
s.insert(9);
s.insert(7);
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
// 返回中序第一个7
auto pos = s.find(7);
while (pos != s.end())
{
//*pos = 10;————key不可修改
cout << *pos << " ";
++pos;
}
cout << endl;
cout << s.count(7) << endl;
auto ret = s.equal_range(6);//相同元素的上下限范围
auto itlow = ret.first;
auto itup = ret.second;
// [itlow, itup)
// [7,7) //不存在该区间
cout << *itlow << endl;
cout << *itup << endl;
s.erase(itlow, itup);
for (auto e : s)
{
cout << e << " ";
}
cout << endl;
}
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;
函数 | 功能说明 |
---|---|
map() | 构造一个空的map |
void test_map1()
{
map<string, string> dict;
pair<string, string> kv1("insert", "插入");
dict.insert(kv1);
dict.insert(pair<string, string>("sort", "排序"));
// C++98
dict.insert(make_pair("string", "字符串"));
// C++11 多参数的构造函数隐式类型转换
dict.insert({ "string", "字符串" });
// 隐式类型的转换
string str1 = "hello";
A aa1 = { 1, 2 };
pair<string, string> kv2 = { "string", "字符串" };
}
函数 | 功能说明 |
---|---|
bool empty ( ) const | 检测map中的元素是否为空,是返回true,否则返回false |
size_type size() const | 返回map中有效元素的个数 |
mapped_type& operator[] (const key_type& k) | 返回去key对应的value |
函数 | 功能说明 |
---|---|
pair<iterator,bool> insert (const value_type& x ) | 在map中插入键值对x,注意x是一个键值对,返回值也是键值对:iterator代表新插入元素的位置,bool代表释放插入成功 |
void erase ( iterator position ) | 删除position位置上的元素 |
size_type erase ( const key_type& x ) | 删除键值为x的元素 |
void erase ( iterator first,iterator last ) | 删除[first, last)区间中的元素 |
void swap (map<Key,T,Compare,Allocator>&mp ) | 交换两个map中的元素 |
void clear ( ) | 将map中的元素清空 |
iterator find ( const key_type& x=) | 在map中插入key为x的元素,找到返回该元素的位置的迭代器,否则返回end |
const_iterator find ( const key_type& x ) const | 在map中插入key为x的元素,找到返回该元素的位置的const迭代器,否则返回cend |
size_type count ( const key_type& x ) const | 返回key为x的键值在map中的个数,注意map中key是唯一的,因此该函数的返回值要么为0,要么为1,因此也可以用该函数来检测一个key是否在map中 |
void test_map1()
{
map<string, string> dict;
pair<string, string> kv1("insert", "插入");//——————————法1
dict.insert(kv1);
dict.insert(pair<string, string>("sort", "排序"));//——————————法2
// C++98
dict.insert(make_pair("string", "字符串"));//——————————法3(好处,不用再写key,value类型)
// C++11 多参数的构造函数隐式类型转换
dict.insert({ "string", "字符串" });//——————————法4
}
map<string, string> dict;
dict.insert(make_pair("string", "字符串"));
dict.insert(make_pair("sort", "排序"));
dict.insert(make_pair("insert", "插入"));
// 不插入,不覆盖;插入过程中,只比较key,value是相同无所谓
// key已经有了就不插入了
dict.insert(make_pair("insert", "xxxx"));
void test_map4()
{
map<string, string> dict;
dict.insert(make_pair("string", "字符串"));
dict.insert(make_pair("sort", "排序"));
dict.insert(make_pair("insert", "插入"));
cout << dict["sort"] << endl; // 查找和读
dict["map"]; // 插入
dict["map"] = "映射,地图"; // 修改
dict["insert"] = "xxx"; // 修改
dict["set"] = "集合"; // 插入+修改
}
map<string, string> dict;
//利用迭代器
auto it = dict.begin();
while (it != dict.end())
{
//it->first = "xxx";
//it->second = "xxx";
//cout << (*it).first << ":" << (*it).second << endl;
cout << it->first << ":" << it->second << endl;
++it;
}
cout << endl;//别漏了最后一个
//范围for
for (const auto& kv : dict)
{
cout << kv.first << ":"<<kv.second<<endl;
}
void test_map3()
{
// 统计次数
string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉" };
map<string, int> countMap;
//范围for(推荐)
for (auto e : arr)
{
countMap[e]++;
}
for (const auto& kv : countMap)
{
cout << kv.first << ":" << kv.second << endl;
}
//迭代器法
//for (auto e : arr)
//{
// auto it = countMap.find(e);
// if (it == countMap.end())
// {
// countMap.insert(make_pair(e, 1));
// }
// else
// {
// it->second++;
// }
//}
}
注意:multimap和map的唯一不同就是:map中的key是 唯一的 ,而 multimap中key是可以重复的。