C++中set、map的使用总结

参考

  • 代码随想录
  • C++参考手册

前言

在c++中使用哈希法解决问题时,一般会选择如下三种数据结构:数组、set(集合)、map(映射)。数组的使用相对较简单,这里对set和map做一个简单总结。
哈希表是根据关键码的值直接访问数据的数据结构。我们常用的数组就是一张哈希表,哈希表中的关键码就是数组的索引下标,通过下标可以直接访问数组中的元素。哈希表一般用于快速判断一个元素是否出现在集合里。

一、set

C++中集合的底层实现及优劣如下:
C++中set、map的使用总结_第1张图片
上图摘自代码随想录
由于set三种集合的区别不大,这里只给出set的一些用法。

模板定义

template<
    class Key,  // 键 key 和值 value 的类型
    class Compare = std::less<Key>, // 指定 set 容器内部的排序规则
    class Allocator = std::allocator<Key>  // 指定分配器对象的类型
> class set;

常用成员函数

iterator begin():返回指向首元素的迭代器
iterator end():返回指向后最后元素的迭代器
reverse_iterator rbegin():返回指向首元素的逆向迭代器
reverse_iterator rend():指向末元素后一元素的逆向迭代器
bool empty() :检查容器有无元素,若容器为空则为 true ,否则为 false
size_type size() :返回容器中元素数
void clear():从容器擦除所有元素
std::pair insert( const value_type& value ):插入 value元素
iterator erase( iterator pos ):从容器中移除指定的元素
size_type count( const Key& key ) :返回拥有比较等价于 key 的关键的元素数
iterator find( const Key& key ):寻找键等于 key 的的元素,若找不到这种元素,则返回尾后迭代器

示例

#include 
#include 

using namespace std;

int main(void)
{
    set<int> s{2,5,3,7};
    s.insert(1);
    cout << "size = " << s.size() << endl;
    for(auto it = s.begin();it != s.end();it++)
        cout << *it << " ";
    cout << endl;
    cout << "count(1) = " << s.count(1) << endl;
    //若1存在就把它删除
    if(auto pos = s.find(1) != s.end())
        s.erase(pos);
    for(auto it = s.begin();it != s.end();it++)
        cout << *it << " ";
    cout << endl;
}

输出如下:

size = 5
1 2 3 5 7 
count(1) = 1
2 3 5 7 

二、map

C++中映射的底层实现及优劣如下:
C++中set、map的使用总结_第2张图片

这里也只对map的使用做简单说明,multimap和unordered_map的使用也是类似。

模板定义

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T>>
> class map;

常用成员函数

iterator begin():返回指向首元素的迭代器
iterator end():返回指向 map 末元素后一元素的迭代器
reverse_iterator rbegin():指向首元素的逆向迭代器
reverse_iterator rend():指向末元素后一元素的逆向迭代器
T& at( const Key& key ):返回到拥有等于 key 的关键的元素被映射值的引用
T& operator[]( const Key& key ):返回到映射到等于 key 的键的值的引用,若这种键不存在则进行插入
bool empty() :检查容器有无元素
size_type size():获取容器中的元素数量
void clear():清除元素
insert():插入元素
erase():擦除元素
size_type count( const Key& key ) :返回拥有关键 key 的元素数
iterator find( const Key& key ):寻找键等于 key 的的元素

示例

#include 
#include 

using namespace std;

int main(void)
{
    map<int,string> mp1;
    map<int,string> mp2{{1,"Hello"},{2,"World"}};
    mp1[1] = "abc";
    mp1[2] = "def";
    mp1.insert({3,"ghi"});
    cout << "mp1: " ;
    for(auto it = mp1.begin();it != mp1.end();it++)
        cout << it->first << ":" << it->second << "   ";
    cout << endl << "mp2: " ;
    for(auto it = mp2.begin();it != mp2.end();it++)
        cout << it->first << ":" << it->second << "   ";
    cout << endl;
    cout << "mp1.at(1) = " << mp1.at(1) << endl;
    cout << "mp2[1] = " << mp2[1] << endl;
    auto pos = mp1.find(3);
    if(pos != mp1.end())
        mp1.erase(pos);
    cout << endl << "mp1: " ;
    for(auto it = mp1.begin();it != mp1.end();it++)
        cout << it->first << ":" << it->second << "   ";
    cout << endl;
}

输出如下:

mp1: 1:abc   2:def   3:ghi   
mp2: 1:Hello   2:World   
mp1.at(1) = abc
mp2[1] = Hello

mp1: 1:abc   2:def 

你可能感兴趣的:(C/C++,c++,哈希,数据结构,算法)