假设我有两个看起来像这样的数组:
first array : 8 5 6 1 4 11 7
second array: 1 1 1 1 0 0 0
我想按降序排序第一个数组,第二个数组中元素的顺序应该与第一个数组的顺序相同,并删除第一个数组中的元素,第二个数组中的对应值为0。第一个数组中对应值为0的元素应该进入不同的数组。最后应该打印两个数组的总和。
所以最终的数组应如下所示:
first array : 8 6 5 1
second array: 1 1 1 1
sum= 8+6+5+1=20
具有值的新数组:
first array : 11 7 4
second array: 0 0 0
sum = 11+7+4=22
有关如何在c ++中执行此操作的任何想法
这是我到目前为止所做的...我尝试使用waytoShort()方法:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool wayToSort(int a, int b)
{
return a > b;
}
int main()
{
int n;
int sum;
sum=0;
cout<<"no. of elements in first array: "<<endl;
cin>>n;
//no. of elements in both array should be same.
vector<int> l(n);
vector<int> t(n);
for(int i=0;i<n;i++)
{
cin>>l[i]>>t[i];
}
sort(l.begin(),l.end(),wayToSort);
for(int i=0;i<n;i++)
{
cout<<l[i]<<" "<<t[i]<<endl;
}
for(int j= 0; j<n;j++)
{
sum = sum+l[j];
}
cout<<sum<<endl;
return 0;
}
这只排序第一个数组。
答案 0 :(得分:1)
请注意,在对数组进行排序之前,您可以将数组拆分为两部分,然后单独对每个数组进行排序 示例:
8 5 6 1 4 11 7
1 1 1 1 0 0 0
分成:
1) [8 5 6 1],[1,1,1,1]
2) [4 11 17],[0,0,0]
然后单独对每个数组进行排序,结果:
1) [8 6 5 1],[1,1,1,1]
2) [17 11 4],[0,0,0]
答案 1 :(得分:0)
如果我正确理解你,你希望根据第二个元素过滤元组列表,然后你希望根据第一个元素对元组列表进行排序。我没有发现任何对操作顺序的重要影响,所以你应该先过滤。
将问题表示为两个不同的元素集可能不是可行的方法(当然,假设由于某些外部约束,您不需要使用两个单独的列表)。
为了与上述保持一致,你应该使用一个列表,但它应该是成对的(std :: pair)。任何基于X的突变都会隐式地拖动Y。
至于删除右元素== 0的对。这应该是相当线性的。即使您首先执行此操作,也不会注意到对整体运行时间的影响(通过一对数组的单次运行,当排序无论如何都会发生真正的重负荷时)。
排序对非常简单:
Sorting a std::vector<std::pair<std::string,bool>> by the string?
选择数据表示很重要。您可能想要使用std :: vector,但是因为您可能会删除许多可能导致性能下降的事情。对于大范围的数据集,这可能会引发大规模的重新洗牌。在这些情况下,使用std :: list可能更好。
答案 2 :(得分:0)
您正在执行表明您的容器类型错误的操作。
multimap
已经完成 1 ,因此您永远不需要对键进行排序(“第一个数组”。)鉴于multimap<int, int> arrays
2 可以这样做:
multimap<int, int> newarrays;
auto it = begin(arrays);
while(it != end(arrays)) {
if(it->second != 0) {
++it;
} else {
newArrays.insert(*it);
it = arrays.erase(it);
}
}