C++ 如果我对一个向量进行排序,我怎样才能让另一个向量与该向量对齐? [复制]

Posted

技术标签:

【中文标题】C++ 如果我对一个向量进行排序,我怎样才能让另一个向量与该向量对齐? [复制]【英文标题】:C++ If I sort a vector, how can I get another vector to align with that vector? [duplicate] 【发布时间】:2022-01-18 03:13:27 【问题描述】:

我用 C++ 创建了这个小项目,用于篮球“游戏”。我想要实现的一件事是一个功能,它允许人们查看所有玩家中谁的统计数据最高或最低,在这种情况下,具体来说是每场比赛的得分 (ppg)。 我将球员的统计数据组件和球员的名字分成两个不同的向量,vector <vector <string> > namesvector <vector <double>> stats。我这样做是为了使名称[0]与统计[0]相关联,因此勒布朗和他的统计将用1表示。我想出了如何按降序或升序对向量进行排序,但是当我对向量进行排序时,比如说stats[0],该顺序现在与原始顺序不同,因此它与名称 [0] 不一致。因此,当我打印 stats[0][i] 属于 names[0][i] 时,它不再是真的,因为两者不再“连接”。我试过自己先解决这个问题,但结果是空的,然后尝试在网上搜索一个我没有找到的答案,也许我看起来不够努力。我该怎么做才能正确写出现在混淆的统计向量顺序?

我创建的这段代码,如下所示,有时可以工作,对于 ppg,它可以工作到 20 左右。我尝试创建它,以便您可以使用任何向量。

void sorting_test(bool ascend, int number, vector <double> statistic) 
        vector <vector <double>> ppg_desc 
            ,//ppg
            ,//slot
            ,//locked
        ;
        //
        for (int i = 0; i < statistic.size(); i++) 
            ppg_desc[0].push_back(statistic[i]); 
            ppg_desc[1].push_back(i);
        
        sort(ppg_desc[0].begin(), ppg_desc[0].end());
        if (ascend == false)
        reverse(ppg_desc[0].begin(), ppg_desc[0].end());
        //
        for (int i = 0; i < statistic.size(); i++) 
            //
            bool lok = false;
            //
            for (int f = 0; f < statistic.size(); f++) 
                //
                for (int d = 0; d < ppg_desc[2].size(); d++) 
                    //
                    if (i == ppg_desc[1][d])  
                        //
                        lok = true; 
                        //
                        for (int s = f + 1; s < statistic.size(); s++) 
                            //
                            if (statistic[s] == ppg_desc[0][i]) 
                                lok = false;
                                f = s;
                                if (f >= statistic.size()) f = statistic.size() - 1;

                            
                            
                        
                    
                    
                
                //
                //if (stats[6][f] == ppg_desc[0][i] && lok == false) ppg_desc[1][i] = f, ppg_desc[2].push_back(ppg_desc[1][i]), cout<<i<<"-";
                if (statistic[f] == ppg_desc[0][i] && lok == false) ppg_desc[1][i] = f, ppg_desc[2].push_back(i);
            
            
        
        //

        for (int i = 0; i < number; i++) 
            cout << i << ".) " << ppg_desc[0][i] << " - " << names[0][ppg_desc[1][i]] << endl;
        
        //
    

【问题讨论】:

您在单个向量中没有名称和统计信息是否有原因? 很可能,您希望向量包含结构或类的实例,同时包含名称和统计信息。 我认为向量只能是一件事 @Frank - 是的,但“一件事”可以是包含两件事的struct。魔法! 【参考方案1】:

您基本上需要的是一个索引列表,按其中一个向量内容排序。

这可以通过std::sort 的变体来实现,采用函数对象/lambda;像这样:

std::vector<int> score = 2,4,3;
std::vector<std::string> names = "a", "b", "c";
std::vector<int> V(N);
std::iota(V.begin(),V.end(), 0); // fill V with values increasing by 1
std::sort(V.begin(),V.end(), [&](int i,int j)return score[i]<score[j]; );
std::cout << "Names sorted by score: " << names[V[0]] << ", "<< names[V[1]] << ", "<< names[V[2]] << "\n";

如您所见,您可以使用V 中的索引(现在按score 排序)作为names 的索引。

见example at cpp.sh

灵感:https://***.com/a/40183830

如 cmets 中所建议的,另一种解决方案是将属于一起的所有值(在我的示例中包括名称和分数)包含到一个结构中,然后拥有该结构的向量,然后再次使用上述排序方法一个专门的排序函数。

struct Player  std::string name; int score; 
std::vector<Player> players;
//... insert some players
std::sort(players.begin(), players.end(), [](auto const & p1, auto const & p2)  return p1.score < p2.score; );
// .. and now all your data is sorted by score!

【讨论】:

以上是关于C++ 如果我对一个向量进行排序,我怎样才能让另一个向量与该向量对齐? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 使用 std::sort 对结构向量进行排序导致读取访问冲突

对包含对象的向量的元素进行排序

C++ 按列对二维向量进行排序

用于对包含指向自定义类对象的指针的向量进行排序的比较器

在 C++ 崩溃中使用向量向量进行基数排序

按多个条件对向量进行排序