【数据结构】【C++STL】动态数组 集合 映射和优先队列

前端之家收集整理的这篇文章主要介绍了【数据结构】【C++STL】动态数组 集合 映射和优先队列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

今天全都 比较 会了 2333

vector动态数组

文件为vector 构造方式为 vector< ll(类型) > vec(变量名)
主要操作代码如下:

int main(){
        vec.push_back(1);
        vec.push_back(2);
        vec.push_back(3);

        for(register int i=0;i<vec.size();i++)
                printf("%d ",vec[i]);
                cout<<endl;
        for(vector< ll >::iterator i=vec.begin();i!=vec.end();i++)
                printf("%d ",*i);
                cout<<endl;

        vec[4] = 4;
        vec[10] = 10;
        vec[1] = 1;

        for(register int i=0;i<vec.size();i++)
                cout<<vec[i]<<" ";
                cout<<endl;
        cout<<vec[4]<<" "<<vec[10]<<" "<<vec[1]<<endl;

        vec.clear();
        cout<<"size:"<<vec.size()endl;
        cout<<"但是元素还在不信你看"<<vec[0]<<" "<<vec[4]<<" ";
}

首先是插入元素 我们可以用第2行的push_back(x)在动态数组末尾插入一个元素 也可以像第13行一样直接搞 然后遍历方式有两种 第一个for循环是朴素的直接遍历 第二个是迭代器 问了一下清华大学的学长 按理说应该第二个快
下面问题来了 第三个循环输出的数只有三个 直接定义的vec[4 10]没有输出 因为vec.size()的大小只跟push_back的数量有关
另一个问题 vec.clear()可以清空动态数组 但实际上只是把vec.size()清0了 之前的元素都还保留

刚才代码输出结果为下图:

set集合

文件为set 构造方式为 set< string(类型) > name(变量名)
主要操作代码如下:

int main(){
        name.insert("crstiano.ronaldo");
        name.insert("lionel.messi");
        name.insert("alexis.sanchez");
        name.insert("somebody");
        name.erase("somebody");

        if(name.count("somebody"))
                cout<<"2333"<<endl;
        if(name.count("crstiano.ronaldo"))
                cout<<"CR7 is a great soccer player!"<<endl;

        for(set< string >::iterator i=name.begin();i!=name.end();i++)
                cout<<*i<<" ";
                cout<<endl;

        cout<<name.size()<<endl;
        name.clear();
        cout<<name.size()<<endl;
}

怎么往name这个集合里面添加东西呢?第一行的name.insert(sth)就可以做到 同理name.erase(sth)就是删除元素了 于是后面的遍历里面也没有somebody 然后就是name.count(sth) 类似于一个询问 如果集合里有这个元素就返回true 否则返回false 关于遍历也是使用迭代器 name.clear()与vector里面的同理

刚才代码输出结果为下图:

map映射

文件为map 构造方式为 map< string(类型),string(类型) > team(变量名)
主要操作代码如下:

int main(){
        team.insert(pair< string,string > ("henry","arsenal"));
        team.insert(pair< string,string > ("aguero","manchester city"));
        team.insert(pair< string,string > ("terry","chelsea"));
        team.insert(pair< string,string > ("somebody","aclub"));
        cout<<team["henry"]<<endl;
        cout<<team["somebody"]<<endl;
        team["somebody"] = "arsenal";
        cout<<team["somebody"]<<endl;

        if(team.count("me"))
                cout<<"i am in the "<<team["me"]<<endl;
        else    cout<<"i am a free soccer player"<<endl;
        cout<<team["me"]<<endl;
        if(team.count("henry"))
                cout<<"henry is in the "<<team["henry"]<<endl;
        else    cout<<"henry is a free soccer player"<<endl;

        cout<<"line up:"<<endl;
        for(map< string,string >::iterator i=team.begin();i!=team.end();i++)
                cout<<i->first<<" is in the "<<i->second<<endl;

        cout<<team.size()<<endl;
        team.clear();
        cout<<team.size()<<endl;
}

插入映射好像挺麻烦的 因为我们需要一个pair类型的结构 比如说第二行的team.insert(sth) henry和arsenal都是string的 我们可以理解为 henry指向了arsenal(亨利永远都属于阿森纳!COYG) 所以我们输出team[“henry”]的时候就会输出arsenal 就好像回答你亨利是阿森纳队的一样 我们也可以像第8行那样直接搞 也没有问题 team.count()和set里面的也差不多 但是有一个神奇的现象 注意那个me 我从来没有加过它 结果它竟然在最后遍历的时候也被遍历出来了 但team[“me”]是空的 最后遍历也是迭代器 注意first和second分别代表什么 team.size()也一样

刚才代码输出结果为下图:

priority_queue优先队列

文件为queue 构造方式为 priority_queue< ll(类型) > q(变量名)
这是系统默认大根堆 小根堆可以这样
priority_queue< ll(类型),vector< ll >(类型),greater< ll >(类型) > q(变量名)

主要操作代码如下:

int main(){
        q.push(10);
        cout<<q.top()<<endl;
        q.push(1);
        cout<<q.top()<<endl;
        q.push(100);
        cout<<q.top()<<endl;
        cout<<"size:"<<q.size()<<endl; 
        q.pop(); q.pop();
        cout<<q.top()<<endl;
        cout<<"size:"<<q.size()<<endl;
}

比较好理解 q.push(x)放入元素 但是每次q.top()访问队首都是当前最大的 因为是大根堆 然后q.pop()就是弹出队首 q.size()和之前同理

刚才代码输出结果为下图:

累 over COYG

猜你在找的数据结构相关文章