C++ STL容器大全( 未完待续 )

STL容器用法大全

  1. vector  ( 动态数组,可支持随意访问 )

功能

写法

时间复杂度

定义vector容器

vector<Type>v

/

元素个数

v.size ( )

O ( 1 )

尾部增加元素

v.push_back( <元素> )

O ( 1 )

在第i个元素前面插入k

v.insert ( a.begin ( ) +i , k )

O ( N )

尾部删除元素

v.pop_back( <元素> )

O ( 1 )

删除区间[ i , j-1 ]的元素

v.erase ( a.begin () + i , a.begin ( ) + j)

O ( N )

判断是否为空

v.empty ( )

O ( 1 )

清空容器

v.clear ( )

O ( N )

返回首/末的元素

v.front ( ) / v.back ( )

O ( 1 )

打印第i个元素

cout << v[ i ]

O ( 1 )

翻转元素

reverse ( v.begin ( ) , v.end ( ) )

O ( N )

排序

sort ( v.begin ( ) , v.end ( ) )

O ( N*LogN)


        2.set(集合,底层是平衡二叉树,加入元素后自动排序

  • 定义 :  set < Type > st ;
  • 插入/删除元素x :  st . insert ( x ) / st . erase ( x )

        迭代器和auto的使用:

Ⅰ.定位 :st . begin ( ) —— 首位 / st . rbegin( ) —— 反向迭代器首位(末位)

Ⅱ.强制转换——*

遍历:

for ( auto it = st.begin ( ) ; it != st.end ( ) ; it++ ) cout << *it << endl;

(所以此时可以清晰地理解*max_element(<左闭区间,右开区间>)和*min_element(<左闭区间,右开区间>)的*号含义)

Ⅲ.位置的移动——自增、自减符号(++ 、--)

上一位:*- -it   下一位:*++ it  (绝对不能使用it+=1或者it-=1!!!)

Ⅳ.函数的使用

        返回容器内的元素个数 : st.size ( )

        查找一个元素:st . find ( )

        if ( st.find ( ) != st.end( ) )  (当查找不到时会返回st.end ( ))

        提取容器的长度 : st . size ( )

        二分查找:st.upper_bound ( x )  ( 找到第一个大于x的下标 )

        st.lower_bound ( x )  ( 找到第一个大于等于x的下标 )

        => 强制转化: *st.upper_bound ( x )  ( 找到第一个大于x的值 )

        *st.lower_bound ( x )  ( 找到第一个大于等于x的值 )

        =>  推广 :找到离x最近的左边元素元素为*--st.lower_bound ( x )

        ( 当不存在时则会返回st.end ( ),st.end( )指的不是set的最后一位,而是最后一位的后一位,可理解为不存在,通常情况下st.end( )等于st.size( )


        3.multiset(多重集合可重复的set容器,可完全代替优先队列的功能

          注意两种erase:

           insert(x),insert(x),erase(x)之后没有x了(erase是全删)

           insert(x),insert(x),erase(s.find(x))后仅剩一个x(删除一个找到的x)


        4.map

  • 定义 : map < Type1 , Type2 > mp ; (注意,如果是字符串类型只能使用string而不能使用char数组)
  • map可理解为字典的映射,其中Type1代表键的类型,Type2代表值的类型
  • map的遍历:

        对于已赋键值的数对,可按字典大小进行遍历——

for(auto it : mp) cout << it.first << " " << it.second ;

map本质上可以看做容器pairfirstsecond分别对应值!


      5.queue(队列,特点 :先进先出)

  • 定义 :  queue < Type > q ;
  •  STL容器——
    • 插入 / 删除x : q.push ( x ) / q. pop ( x )
    • 返回队列的第一个/最后一个元素 :  q. front ( ) / q. back ( )
    • 判断队列是否为空 : q.empty ( )
    • 返回容器内的元素个数 : q.size ( )

  •  数组写法(推荐)
    •  初始化 : int head = 0 , tail = 0 ; [ head , tail ]
    •  push( x ) : a [ ++tail ] = x ;  pop ( x ) : head++;
    •  当前第k个元素 : a [ head + k - 1 ]


    6. priority_queue ( 底层用大小根堆实现,只需log(n)的时间动态地维护数据的有序性 

⑴ 定义:

Ⅰ. priority_queue < Type > q (大根堆,默认降序)

Ⅱ . priority_queue < Type , vector< Type > , less< Type >>(大根堆,默认降序)

priority_queue < Type , vector< Type > , greater< Type >>(小根堆,默认升序)

Ⅲ. priority_queue < node , vector < node > , cmp> (自定义结构体类型排序)

例 :

struct node{ // 结构体定义

        string name;

        int price;

};

struct cmp{  // 默认排序

        bool operator() (node f1,node f2){

        return f1.price > f2.price ;

        }

 }

priority_queue < node , vector < node > , cmp >; //优先队列嵌套结构体及其排序

⑵操作:

Ⅰ. 插入 / 删除x : q.push ( x ) / q. pop ( x )

Ⅱ . 返回队列的第一个/最后一个元素 :  q. top ( )

Ⅲ . 判断队列是否为空 : q.empty ( )

Ⅳ. 返回容器内的元素个数 : q.size ( )


      7.stack(特点 :先进后出)

  • 定义 :  stack < Type > s ;
  • STL容器——
    •  插入 / 删除x :  s.push ( x ) / s. pop ( x )
    •  返回队列的第一个元素 :  s. top ( )
    •  判断队列是否为空 :  s.empty ( )
    •  返回容器内的元素个数 : s.size ( )
  •  数组写法(推荐)
    •  初始化 : int top = 0 
    •  push( x ) : a [ ++top ] = x ;  pop ( x ) : top++;
    •  当前栈顶元素:a [ top ]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值