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> > names
和 vector <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++ 如果我对一个向量进行排序,我怎样才能让另一个向量与该向量对齐? [复制]的主要内容,如果未能解决你的问题,请参考以下文章