C++常见数据结构图文详解

声明

本文转自https://www.cnblogs.com/woxinfeixiang2015/p/10373674.html


程序 = 数据结构 + 算法

数组

在这里插入图片描述

静态数组

运行期间无法改变数组大小,由编译期间确定,C++中array即此类

int main ()
{
    array<int, 10> a = {0,1,2,3,4,5,6,7,8,9};
    a[0] = 22;
    cout<<a.at(0)<<endl;
    cout<<a.back()<<endl;

    return 0;
}

动态数组:C++中有两个,分别是vector和deque

vector

矢量,只能在末尾增删元素

数组大小增长策略:每次增加长度为原来1倍(有些编译器增加0.5倍)

这样可保证追加元素的平均时间复杂度为O(1)

int main ()
{
    vector<int> vv = {1,2,3,4};
    vv.push_back(12);// 在末尾添加元素
    vv.pop_back();// 在末尾删除元素
    vv.at(3);// 读取第三个元素
    vv[3];// 读写第三个元素
    vv.insert(vv.begin()+3, 12);// 将元素插到第三个位置上
    
    return 0;
}
priority_queue

优先队列,默认由 vector 实现,也可由 deque 实现。它保证顶部元素始终是最大值,可用于实现堆排序。

int main ()
{
    priority_queue<int> pp;
    pp.push(12);
    pp.push(10);
    pp.push(11);
    pp.top();// 读取顶部元素
    pp.pop();// 弹出顶部元素
    
    return 0;
}
deque

双端队列,可在开头或末尾增删元素

int main ()
{
    deque<int> dd;
    dd.push_front(12);// 在开头添加元素
    dd.push_back(10);// 在结尾添加元素
    dd.insert(dd.begin()+1, 3);// 在位置1插入元素
    dd.front();// 读取开头元素
    dd.back();// 读取结尾元素
    dd[1]; // 读取第一个元素
    dd.pop_front();// 弹出开头元素
    dd.pop_back();// 弹出末尾元素

    return 0;
}
stack

栈,默认由 deque 实现,也可由 list 或 vector 实现。是一种先进后出的数据结构

int main ()
{
    stack<int> ss;
    ss.push(12);// 添加元素
    ss.top();// 读取栈顶元素
    ss.pop();// 弹出栈顶元素

    return 0;
}
queue

队列,默认由 deque实现,也可由 list 实现。是一种先进先出的数据结构

int main ()
{
    queue<int> qq;
    qq.push(12);// 添加元素
    qq.front();// 读取队首元素
    qq.pop();// 弹出队首元素

    return 0;
}

单向链表

在这里插入图片描述

forward_list

只能从头到尾顺序遍历,不能逆序遍历,即没有 rbegin() 接口

int main ()
{
    forward_list<int> fl;
    fl.push_front(12);// 在开头添加元素
    fl.insert_after(fl.begin(), 11);
    fl.pop_front();// 在开头删除元素
    fl.remove(11);// 删除元素

    return 0;
}

双向链表

在这里插入图片描述

int main ()
{
    list<int> ll;
    ll.push_back(12);// 在末尾添加元素
    ll.push_front(10);// 在开头添加元素
    ll.back();// 读取末尾元素
    ll.front();// 读取开头元素
    ll.push_back(12);
    ll.unique();// 删除重复元素
    cout<<ll.size()<<endl;
    ll.pop_front();// 在末尾删除元素
    ll.pop_back();// 在开头删除元素

    return 0;
}

在这里插入图片描述
常见的树有二叉树、二叉搜索树、二叉平衡树、红黑树等。

C++ 中的 set multiset map multimap 是用二叉搜索树实现的,这种数据结构支持二分搜索,所以增删改查的复杂度都是O(logn)。

set

类似数学中的集合,set 中不能包含重复的元素,元素是排好序的,且不能被修改。

int main ()
{
    set<int, less<int>> ss;// 由小到大排序
    ss.insert(12);
    ss.insert(10);
    for(auto itr=ss.cbegin(); itr!=ss.cend(); itr++)cout<<*itr<<endl;// 输出 10 12
    ss.erase(ss.cbegin());// 擦除首元素
    ss.count(13);// 元素 13 的个数,0 或 1
    ss.find(10);// 查找元素 12,返回迭代器,若没找到返回 ss.end()

    return 0;
}
multiset

与 set 类似,但可以包含重复元素

int main ()
{
    multiset<int, less<int>> ms;// 由小到大排序
    ms.insert(12);
    ms.insert(10);
    ms.insert(10);
    for(auto itr=ms.cbegin(); itr!=ms.cend(); itr++)cout<<*itr<<endl;// 输出 10 10 12
    cout<<""<<endl;
    auto pp = ms.equal_range(10);
    for(auto itr=pp.first; itr!=pp.second; itr++)cout<<*itr<<endl;// 输出 10 10
    ms.lower_bound(10);// = pp.first
    ms.upper_bound(10);// = pp.second

    return 0;
}
map
int main ()
{
    map<int, int> mm;
    mm[1] = 1;// 插入元素 (1,1)
    mm.insert(make_pair(2,2));// 插入元素 (2,2)
    for(auto itr=mm.cbegin(); itr!=mm.cend(); itr++)
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 输出 (1,1) (2,2)

    return 0;
}
multimap
int main ()
{
    multimap<int, int> mm;
    mm.insert(make_pair(1,10));// 插入元素 (1,10)
    mm.insert(make_pair(1,11));// 插入元素 (1,11)
    mm.insert(make_pair(2,2));// 插入元素 (2,2)
    for(auto itr=mm.cbegin(); itr!=mm.cend(); itr++)// 遍历所有元素
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 输出 (1,10) (1,11) (2,2)
    for(auto itr=mm.lower_bound(1); itr!=mm.upper_bound(1); itr++)// 遍历 key=1 的元素
        cout<<"("<<itr->first<<","<<itr->second<<")"<<endl;// 输出 (1,10) (1,11)
    mm.erase(1);// 删除所有 key=1 的元素
    mm.erase(mm.cbegin());// 删除第一个元素

    return 0;
}

映射

在这里插入图片描述

映射类似数学中的函数,每一个 key 对应一个 value,写成函数表达式为:value=f(key),其中 f 被称为哈希函数。

C++11 中的 unordered_set unordered_multiset unordered_map unordered_multimap 是用映射实现的,这种数据结构可以在O(1)的时间复杂度下访问单个元素,效率高于二叉搜索树(O(logn)),但是遍历元素的效率比二叉搜索树低。

  1. unordered_set

接口与 set 类似,不在赘述

  1. unordered_multiset

接口与 multiset 类似,不在赘述

  1. unordered_map

接口与 map 类似,不在赘述

  1. unordered_multimap

接口与 multimap 类似,不在赘述

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值