写了个可能存在缺陷代码,仅供参考。
/*
* @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;
}
}
编译结果:
参考: