您现在的位置是:首页 > 技术文章网站首页技术文章

[C++]常用数据结构认识

  • WangYe
  • 2020-08-17 09:40:53
  • 441 次阅读
所有的容器归根到底都是内存空间的排列方式和在空间上施加各种各种不同的限制所得的。

    所有的容器归根到底都是内存空间的排列方式和在空间上施加各种各种不同的限制所得的。空间排列方式只有线性和链式两种方式,链式是通过记录每一个数据的地址来实现查找下一位数据的。而每一个容器所具有的特性就决定了它所适用的情况,总的来看容器常用的无非是增删改查操作,下面将从适用场景、常用操作来进行总结。


    1. Array数组

    内存空间为连续的一段地址,适用于提前已知所要存储的数据类型和数量、进行大量的查、改操作,不适用于含有大量交换、删除、增加数据的操作,该容器无法动态改变大小,所以说提前已知存储数据类型和数量。以下介绍了数组的初始化、赋值、遍历、获取大小、获取特定位置数据的方法。

#include <iostream>
#include <array>    //头文件
using namespace std;

int main()
{
    array<int,10> myarray;    //array<类型,数量>
    
    for(int i=0;i<10;i++)    //进行赋值
    {
        myarray[i]=i;
    }
    
    cout << "遍历数据" << endl;
    
    for(auto it=myarray.begin();it != myarray.end();it++)    //推荐遍历方式
    {
        cout << *it << '/t';
    }
    
    cout << endl;
    cout << "size fo array is" << myarray.size() << endl;    //获取数组大小
    
    cout << "第四个元素值为:" << myarray[3] << endl;    //获取特定位置的值
    
    return 0;
}


    2. Queue队列

    该容器内存结构最好为链式结构,最1知名的特点是先进先出,能动态调整大小,适用于包含大量增,删操作的情况,但不适用于含有量大的查找操作数据.以下介绍了队列初始化,赋值,弹出操作;

#include <iostream>
#include <array>
#include <queue>    //头文件
using namespace std;

int main()
{
    queue<int> myqueue;    //初始化
    
    for(int i=0;i<10;i++)    //遍历赋值
    {
        myqueue.push(i);
    }
    
    while(!myqueue.empty())    //循环输出
    {
        cout << myqueue.front() << endl;    //获取头部数据
        myqueue.pop();    //弹出头部数据
    }
    return 0;
}


    3. Stack 栈

    栈在内存上可为连续或链式,于队列相反的是它先进后出,适用于压栈出栈操作,如下图用于遍历,递归函数的改写等,以下介绍了栈的初始化,压栈,出栈等操作;

#include <iostream>
#include <array>
#include <queue>
#include <stack>    //头文件
using namespace std;

int main()
{
    stack<int> mystack;    //初始化
    
    for(int i=0;i<10;i++)    //遍历压栈
    {
        mystack.push(i);
    }
    
    while(!mystack.empty())    //循环取栈顶
    {
        cout << mystack.top() << endl;    //取栈元素
        mystack.pop();    //弹出栈顶元素
    }
    
    return 0;
}


    4. List 链表

    链表在内存结构上为链式结构,也就决定它可以动态添加,适用于包含大量增加,删除的操作,但不适用于包含大量查询操作,以下介绍了链表的创建,添加数据,删除数据,获取数据等操作;

#include <iostream>
#include <array>
#include <queue>
#include <stack>
#include <list>
using namespace std;

int main()
{
    int num[] = {1,2,3,4,5};
    list<int> mylist(num,num+sizeof(num)/sizeof(int));    //数组创建链表形式
    
    for(auto it = mylist.begin();it != mylist.end();it++)
    {
        cout << *it << " ";
    }
    
    auto it = mylist.begin();
    
    for(int i=0;i<5;i++)    //遍历插入到指针所在位置前
    {
        mylist.insert(it,i);
    }
    
    cout << endl;
    
    for(auto it = mylist.begin();it != mylist.end();it++)    //遍历元素
    {
        cout << *it << " ";
    }
    
    return 0;
    
}

    5. Map

    map为联式容器,提供一对一服务,每个关键字在容器中只能出现一次,适用于一对一服务;

#include <iostream>
#include <array>
#include <queue>
#include <stack>
#include <list>
#include <map>    //头文件
using namespace std;

int main()
{
    map<char,int> mymap;    //初始化
    
    mymap['a'] = 1;    //赋值
    
    mymap.insert(pair<char,int>('b',2));    //插入数据
    
    mymap.erase('a');    //删除数据
    
    auto it = mymap.find('b');    //查找数据
    cout << it -> first << " " << it -> second << endl;
    
    return 0;
}

    6. Set 集合

    set集和最大特点是里面的元素按顺序排列不重复,以下演示集和初始化,插入,删除,查找等操作;

#include <iostream>
#include <array>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>    //头文件
using namespace std;

int main()
{
    int num[] = {1,2,3,4,5};
    set<int> myset(num,num+sizeof(num)/sizeof(int));    //数组方式初始化
    
    myset.insert(6);    //插入
    
    myset.erase(2);    //删除
    
    auto it = myset.find(3);    //查找
    
    cout << *it << endl;
    
    return 0;
}

    7. Vector 向量

    vector向量和array不同,它可以根据数据的大小而进行自动调整,以下展示初始化,插入,删除等操作;

#include <iostream>
#include <array>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <vector>    //头文件
using namespace std;

int main()
{
    vector<int> myvector;
    
    for(int i=0;i<10;i++)    //遍历压栈
    {
        myvector.push_back(i);
    }
    
    for(auto it = myvector.begin();it != myvector.end();it++)    //遍历输出
    {
        cout << *it << endl;
    }
    
    return 0;
}


文章评论 (0)



Top