C++ 实现对vector中元素的重新排序

写了个可能存在缺陷代码,仅供参考。

/*
 * @Description: 将元素编号进行重新排序,相同数值的编号连号
 * @Author: C M
 * @Date: 2021-03-24 09:05:05
 * @LastEditTime: 2021-03-24 18:01:34
 * @LastEditors: C M
 */
#include <iostream>
#include <vector>
#include <map>
using namespace std;

void check(vector<pair<int ,int>> & src);
// #define TEST

int main() {
    int a[12] = { 212, 201, 189, 212, 213, 189, 212, 201, 187, 212, 211, 189 };
    /*原始编号:     5   6    7    8    9    10    11   12   13  14   15   16  */
    /*重排后的编号:  5   9    11   6    14    12    7   10   15   8   16   13  */
    /* 可以看出,若将编号值对元素值排序可得:212 212 212 201 201 189 189 189 213 187 211 */ 

    /* 原始编号设为 5 - 16  */
    vector<pair<int ,int>> vi;
    for(size_t i = 5; i < 5+12; i ++) {
        vi.push_back(make_pair(i, a[i-5]));
    }
    for (vector<pair<int ,int>>::iterator it1 = vi.begin(); it1 != vi.end(); ++it1)
	{
		cout << "id: " << (*it1).first << " value:"  << (*it1).second << endl;
	}
	cout << endl;

    check(vi);

    for (vector<pair<int ,int>>::iterator it1 = vi.begin(); it1 != vi.end(); ++it1)
	{
		cout << "id: " << (*it1).first << " value:"  << (*it1).second << endl;
	}
    cout << endl;
}

void check(vector<pair<int ,int>> & src) {
    /* 创建一个容器储存编号以及数值,同时在每个“对”前插入“标号”,1表示这个数没有被处理过,0表示这个数被处理过 */
    vector<pair<int, pair<int, int>>> deal_v;
    for(size_t i = 0; i < src.size(); i++) {
        deal_v.push_back(make_pair(1, make_pair(src[i].first, src[i].second)));
    }

    /* 记录要处理的元素信息 */
    pair<int, pair<int, int>> check_v;

    for(size_t i = 0; i < src.size(); i++) {

        /* 将当前选定元素的标号设为0,表示该数处理过 */
        deal_v[i].first = 0;

        /* 把当前要处理的存储到check_v中 */
        check_v = deal_v[i];

        /* 向前统计, 若次查找的对组中数值与之前的数值相同,表示这个数出现过,flag = 1*/
        int flag = 0;
        for(size_t j = 0; i < i; j++ ) {
            if(deal_v[j].second.second == check_v.second.second) {
                flag = 1;
                break;
             }            
        }

        /* 这个数是首次出现 */
        if(!flag) {
            size_t id_i = 1;
            /* 向后处理 */
            for(size_t j = i+1; j < deal_v.size(); j++){
                /* 后面的元素与要检查的数值相同 */
                if(deal_v[j].second.second == check_v.second.second) {
                    //把找到的目标值编号放在查找值编号的后面
                    if(deal_v[j].first != 0) {
                        deal_v[j].second.first = check_v.second.first + id_i;
                        deal_v[j].first = 0;

                        /* 查找值与找到值之间的编号+1 */
                        size_t k = i;
                        for(k = i+1; k < j; k++) {
                            if(deal_v[k].second.second != check_v.second.second && deal_v[k].first == 1) {
                                deal_v[k].second.first += 1;
                            }
                        }  
                    }
                    id_i ++;
                    #ifdef TEST
                    /* 找到一个值就输出一次 */ 
                    for (vector<pair<int, pair<int, int>>>::iterator it1 = deal_v.begin(); it1 != deal_v.end(); ++it1)
                    {
                        cout << "id: " << (*it1).second.first << " value:"  << (*it1).second.second << endl;
                    }
                    cout << endl;
                    #endif
                }
            }
        }  
    }
    for(size_t i = 0; i < src.size(); i++) {
        src[i] = deal_v[i].second;
    }
}

编译结果:

参考:

C++ 实现统计vector中各个元素的个数(去重)_快乐的半半的博客-CSDN博客_vector中元素个数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙橙小狸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值