STL容器

vector

vector就是加强版的数组,是连续的顺序的储存结构(和数组一样的类别),有长度可变的特性。

时间复杂度:O(n)

vector的创建
vector<int> pn1 = {1,2,3,4,5,6,7,8,9};  // 构造int数组
vector<int> pn2(10);                 // 构造初始长10的int数组
vector<int> pn3(10,1);         // 构造初始长10的int数组,初值为1


vector<vector<int>> pn4(10,vector<int>());                 // 构造初始10行,不指定列数的二维数组
vector<vector<int>> pn5(10, vector<int> (6, -1)); // 构造初始10行,初始6列的二维数组,初值为 1

//打印vector
for(int i = 0 ;i < pn1.size() ;i++)
{
    cout<< i << endl;
}


for (int i = 0; i < 10; ++i) {
    for (int j = 0; j < pn5[i].size(); ++j) {
            cout << pn5[i][j] << " ";
        }
    cout << endl;
}
插入和弹出 

push_back() :插入

pop_back() :弹出

    //pop_back():删除 vector 尾部的一个元素,数组长度 −1
    //push_back(元素):在 vector 尾接一个元素,数组长度 +1
    pn1.push_back(11);
    pn1.pop_back();
其他操作

clear() :清空

empty() :判断是否为空

resize(新长度,默认值) :改变数组的长度

size() :获取长度


    cout<< pn1.size()<<endl;

    pn1.clear();
    
    if (pn1.empty())
    {
        cout<<123<<endl;
    }
    
    pn1.resize(2,2);

一般情况下 vector 可以替换掉普通数组,如果长度已经确定,那么应当直接在构造函数指定长度,而不是一个一个 .push_back(). 因为 vector 额外内存耗尽后的重分配是有时间开销的,直接指定长度就不会出现重分配了。

STACK

实现先进后出的数据结构
主要用法:

push() :入栈

pop() :出栈

top() : 栈顶

    //实现先进后出的数据结构
    stack<int> sta1;
    //进栈
    sta1.push(1);
    sta1.push(1);
    //出栈
    sta1.pop();
    //取出栈顶元素
    int pn = sta1.top();

queue

主要用法:

push() :进队

pop() :出队

front() :取队首

back() :取队尾

    queue<int> que;
    que.push(1);
    que.pop();
    int a = que.front();
    int b = que.back();

set集合

提供对数时间的插入、删除、查找的集合数据结构。底层原理是红黑树。

集合的三要素:

确定性:一个元素要么在集合中,要么不在

互异性:一个元素仅可以在集合中出现一次

无序性:集合中的元素是没有顺序的

创建and遍历

遍历分为两种:使用迭代器进行遍历、基于范围的循环

    set<int> st1 = {1,2,3,4,5,6};               // 储存int的集合(从小到大)
    set<int, greater<int>> st2; // 储存int的集合(从大到小)

    //遍历
    //迭代器
    for(set<int>::iterator  it = st1.begin();it != st1.end(); it++ )
    {
        cout << *it << endl;
    }

    //基于范围的循环(C++ 11)

    for (auto &pn : st1)
    {
        cout << pn << endl;
    }
其他用法

insert() :插入

erase() :删除

find() :查找

count() :判断元素是否存在

    st1.insert(1);
    st1.erase(1);
    st1.find(2);
    st1.count(5);
注意事项

        set 的迭代器取到的元素是只读的(因为是 const 迭代器),不可修改其值。如果要改,需要先 erase 再 insert

map 映射

提供对数时间的有序键值对结构。底层原理是红黑树。就是字典。

创建and遍历
    map<int, int> mp1 = {{1, 2} ,{3, 4} };               // int->int 的映射(键从小到大)
    map<int, int, greater<int>> st2; // int->int 的映射(键从大到小)

    //遍历
    for (map<int, int>::iterator it = mp1.begin(); it != mp1.end(); it++)
        cout << it->first << ' ' << it->second << endl;

    //基于范围的循环
    for (auto &pr : mp1)
        cout << pr.first << ' ' << pr.second << endl;

    //结构化绑定+基于范围的循环
    for (auto &[key, val] : mp1)
  
        cout << key << ' ' << val << endl;
其他用法

find():查找

erase():删除

count():计数

    mp1[1] = 2;
    auto it = mp1.find(1); //返回的是迭代器
    mp1.erase(1); //元素都是键
    mp1.count(3); //元素都是键

 pair二元组

    //储存二元组
    pair<int,int> p1;
    pair<int, long long> p2;
    pair<char, int> p3;

    //赋值
    pair<int, char> p4 = {1, 'a'};

    //取值
    //取第一个值 first
    //取第二个值 second
    
    int pn1 = p4.first;
    char pn2 = p4.second;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值