gpt4 book ai didi

c++ - 棘手的方法 - 需要解决方案

转载 作者:行者123 更新时间:2023-11-28 03:21:14 26 4
gpt4 key购买 nike

对象数组 tArray 包含买家姓名和购买数量,每个买家可以多次出现在对象数组中。我必须以数组的形式返回五个最大买家的名字。

我尝试并行运行两个数组,其中包含买家名称,并且在另一个数组中有总体积。

我的方法总体上有缺陷,因为我得到了错误的结果,我该如何解决这个问题。

谢谢

ntransactions = 数组中的交易数

string* Analyser::topFiveBuyers()
{
//set size and add buyer names for comparison.
const int sSize = 5;
string *calcString = new string[sSize];
calcString[0] = tArray[0].buyerName;
calcString[1] = tArray[1].buyerName;
calcString[2] = tArray[2].buyerName;
calcString[3] = tArray[3].buyerName;
calcString[4] = tArray[4].buyerName;
int calcTotal[sSize] = {INT_MIN, INT_MIN, INT_MIN, INT_MIN, INT_MIN};

//checks transactions
for (int i = 0; i<nTransactions; i++)
{
//compares with arrays
for(int j =0; j<sSize; j++)
{
//checks if the same buyer and then increase his total
if(tArray[i].buyerName == calcString[j])
{
calcTotal[j] += tArray[i].numShares;
break;
}
//checks if shares is great then current total then replaces
if(tArray[i].numShares > calcTotal[j])
{
calcTotal[j] = tArray[i].numShares;
calcString[j] = tArray[i].buyerName;
break;
}
}
}
return calcString;
}

最佳答案

假设您被允许,我会先将这些值累加到一个 std::map 中:

std::map<std::string, int> totals;

for (int i=0; i<ntransactions; i++)
totals[tarray[i].buyername] += tarray[i].numshares;

这会将每位买家的股份总数相加。然后您想将该数据复制到 std::vector,并按份额数获得前 5 名。目前,我假设您的结构(以 buyernamenumshares 作为成员)被命名为 transaction

std::vector<transaction> top5;

std::copy(totals.begin(), totals.end(), std::back_inserter(top5));

std::nth_element(top5.begin(), top5.begin()+5, top5.end(), by_shares());

为此,您需要一个名为 by_shares 的比较仿函数,它类似于:

struct by_shares { 
bool operator()(transaction const &a, transaction const &b) {
return b.numshares < a.numshares;
}
};

或者,如果您使用的编译器足够新以支持它,您可以使用 lambda 而不是显式仿函数来进行比较:

std::nth_element(totals.begin(), totals.end()-5, totals.end(), 
[](transaction const &a, transaction const &b) {
return b.numshares < a.numshares;
});

无论哪种方式,在第 nth_element 完成后,您的前 5 个元素将位于 vector 的前 5 个元素中。我已经颠倒了正常的比较来做到这一点,所以它基本上是按降序进行的。或者,您可以使用升序,但指定从集合末尾开始的第 5 个位置,而不是从开头开始的第 5 个位置。

我应该补充一点,还有其他方法可以做到这一点——例如,Boost 双映射也能很好地完成这项工作。鉴于这听起来像是家庭作业,我的猜测是像 bimap 这样可以为您处理几乎整个工作的预打包解决方案可能不会/不会被允许(甚至 std::map 可能出于几乎相同的原因被禁止)。

关于c++ - 棘手的方法 - 需要解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15362486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com