算法题里存储数据的方式(C++)

这里分享的不是如邻接矩阵 邻接表的算法存储,仅仅是一些特殊数据的简易存储,以方便操作

1、map<int,vector<int>> mp

当给出很多串数字,每一串数字都需要单数放一个一维数组里,但是开辟一个二维数组内存又过大,并且不好操作时,可以用map<int,vector<int>> mp 来存储,这样就可以单独操作某一串数了

例如存储:第一列数字是这一串数字的个数(第一关键字),后面是具体的数字
                  后面是代码的输出结果,因为map会自动按第一关键字排序,所以第二行会先输出

                                    

map<int,vector<int>> mp;

for(int i=0;i<3;i++){
    int n;
    cin>>n;
    for(int j=0;j<n;j++){
        int x;
        cin>>x;
        mp[n].push_back(x);
    }
}

for(auto t:mp){   //范围for 循环来遍历
    for(int i=0;i<t.first;i++){
        cout<<t.sd[i]<<" ";     //这里就可以是对数组的操作
    }
    cout<<endl;
}

2、vector<int> vec[N]

这种形式和上面那个的作用是一样的,都是可以单独把一串数字放在一个单独区域里的,相对于二维数组来说会节省空间。输入的还是上面那组数据:

vector<int> vec[3];
    
for(int i=0;i<3;i++){
    int n;
    cin>>n;
    for(int j=0;j<n;j++){
        int x;
        cin>>x;
        vec[i].push_back(x);
    }
}

for(int i=0;i<3;i++){
    for(auto t:vec[i]){
        cout<<t<<' ';
    }
    cout<<endl;
}

图示一下结构:

3、pair<int ,int > p[N]

这个在存一对数据的时候很好用,同时可以自由调整关键字排序(map最好不要修改排序规则,会造成错误)输入输出:

                             

pair<int,int> p[3];

for(int i=0;i<3;i++){
    int a,b;
    cin>>a>>b;
    
    p[i]={a,b};   //这两种形式都可以
    p[i]=make_pair(a,b);
}

for(auto t:p){
    cout<<t.first<<' '<<t.second<<endl;
}

4、pair的关键字排序

pair可以按任意关键字排序,值得注意的是,当按第一关键字排序,但是第一关键字相等时,可以按第二关键字再排序

bool cmp(const pair<int, int> &a, const pair<int, int> &b)
{
    if(a.fr==b.fr)  return a.sd < b.sd;
    return a.fr > b.fr;
}

这里是按第一关键字从大到小排序,当第一关键字相等时,按第二关键字从小到大排序,只需要修改大于 小于号就能改变排序规则了

5、固定数组(array)

array的大小是固定的,必须在创建时指定。一旦创建,它的 size 不可改变。一般在二进制有关的题目中可以用到,存放每一位二进制的值

array<int,32> bit(n);  //固定大小为32的数组

6、set <int> 

set就是默认去重的容器,并且默认按升序排序。此时set内只有  1 和 2

set<int> se;

se.insert(1);
se.insert(2);
se.insert(2);

如果需要给数组排序,直接丢进set里效率并不高,此时可以用 unique() 函数去重

vector<int> vec;

vec.erase(unique(vec.begin(), vec.end()), vec.end());

7、当给出三个或四个数据为一组

比如 每一行数据都是 a,b,c,d,可以用 pair<pair<int,int>,pair<int,int>> 这种很集合的方式存,也可以开四个数组 A[n] B[n] C[n] D[n] 来存

pair<pair<int,int>,pair<int,int>> p;

int a=p.first.second;  //遍历需要两个关键字

int a[N],b[N],c[N],d[N];

8、字符串存储

char c[100][100];

for(int i=0;i<3;i++)  cin>>c[i];  
for(int i=0;i<3;i++ ) cout<<c[i]<<endl;

string s[100];

for(int i=0;i<3;i++) cin>>s[i];
for(int i=0;i<3;i++) cout<<s[i]<<endl;


 gg,推荐课程:https://xxetb.xetslk.com/s/kNPSd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值