C++ 如何将一对值从0排列到1?(不使用C+;+;11或更高版本)

C++ 如何将一对值从0排列到1?(不使用C+;+;11或更高版本),c++,ranking,C++,Ranking,我有一张这种类型的地图 map <unsigned, vector < pair <unsigned, float> > > group 现在,我尝试将float部分(打印的第三列)从0排列为1,这样处理后的数据如下所示: 处理的数据 0 43 0 0 3690 0 0 5085 62 0 6085 63 0 977 121 0 4138 142 1 1515 0 1 2863 0 1 6593 64 1 252 96 1 2887 141 0 43 0

我有一张这种类型的地图

map <unsigned, vector < pair <unsigned, float> > > group
现在,我尝试将
float
部分(打印的第三列)从0排列为1,这样处理后的数据如下所示:

处理的数据

0 43 0
0 3690 0
0 5085 62
0 6085 63
0 977 121
0 4138 142
1 1515 0
1 2863 0
1 6593 64
1 252 96
1 2887 141
0 43 0
0 3690 0
0 5085 0.4
0 6085 0.6
0 977 0.8
0 4138 1
1 1515 0
1 2863 0
1 5593 0.4
1 6593 0.6
1 252 0.8
1 2887 1
我以前执行过一些排名,但从未在
对上执行过,也从未从0到1(通常从0到向量大小)执行过


任何指导或解决方案都将不胜感激,因为我对如何处理它感到非常困惑。

我不知道您想要使用的确切排名算法是什么,但这里有一个起点:

#include <algorithm>
#include <map>
#include <vector>
#include <utility>


typedef std::pair<unsigned, float> Pair;
typedef std::vector<Pair> Vec;
typedef std::map<unsigned, Vec> Group;

bool pairLess(Pair const & a, Pair const & b) {
    return (a.second < b.second)
        || (!((a.second < b.second) || (b.second < a.second))
            && (a.first < b.first));
}

void rankGroup(Group & g) {
    for (Group::iterator it = g.begin(); it != g.end(); ++it) {
        if (it->second.empty())
            continue;
        /// \todo handle case with one element?
        Vec & v(it->second);

        /// \todo Substitute for actual ranking algorithm:
        Vec::iterator maxIt(std::max_element(v.begin(), v.end(), &pairLess));
        for (Vec::iterator it2 = v.begin(); it2 != v.end(); ++it2)
            /// \todo handle division by zero:
            it2->second = it2->second / maxIt->second;
    }
}
#包括
#包括
#包括
#包括
typedef std::对;
typedef std::向量向量;
typedef std::map组;
布尔成对(成对常数和a、成对常数和b){
返回(a.秒second.empty())
继续;
///\t要用一个元素处理大小写吗?
Vec&v(it->second);
///\t要替换实际排名算法,请执行以下操作:
Vec::迭代器maxIt(std::max_元素(v.begin()、v.end()、和pairLess));
对于(Vec::迭代器it2=v.begin();it2!=v.end();++it2)
///\t要将句柄除零:
it2->second=it2->second/maxIt->second;
}
}
测试代码:

#include <iostream>

std::ostream & operator<<(std::ostream & os, Group const & g) {
    for (Group::const_iterator it = g.begin(); it != g.end(); ++it) {
        unsigned key = it->first;
        Vec const & v(it->second);
        for (Vec::const_iterator it2 = v.begin(); it2 != v.end(); ++it2)
            os << key << ' ' << it2->first << ' ' << it2->second << '\n';
    }
    return os;
}

void groupAdd(Group & g, unsigned key, unsigned u, float f)
{ g[key].push_back(Pair(u, f)); }

int main() {
    Group input;
    groupAdd(input, 0, 43, 0);
    groupAdd(input, 0, 3690, 0);
    groupAdd(input, 0, 5085, 62);
    groupAdd(input, 0, 6085, 63);
    groupAdd(input, 0, 977, 121);
    groupAdd(input, 0, 4138, 142);
    groupAdd(input, 1, 1515, 0);
    groupAdd(input, 1, 2863, 0);
    groupAdd(input, 1, 6593, 64);
    groupAdd(input, 1, 252, 96);
    groupAdd(input, 1, 2887, 141);
    std::cout << "INPUT:\n" << input << std::endl;

    rankGroup(input);
    std::cout << "RESULT:\n" << input << std::endl;
}
#包括
std::奥斯特拉姆和运营商(秒);
for(Vec::const_迭代器it2=v.begin();it2!=v.end();++it2)

os max_元素(使用自定义比较器检查.second),然后针对每个元素?为什么不简单地迭代映射以找到第三列的最高值,并在第二次遍历时使用它来计算规范化值?@SergeBallesta,因为我不确定如何写入它。我想无论我采用哪种方法,它都需要找到最高值,然后再进行筛选。@Borgleader我不确定我是否理解你的主张。使用比较对来找到具有最高值的一个(在第二列,即第三列),然后运行a来规范化值。