使用c ++根据第一个数组中的元素对第二个数组进行排序,并删除一些元素

时间:2016-07-01 12:53:27

标签: c++ arrays sorting

假设我有两个看起来像这样的数组:

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;

}

这只排序第一个数组。

3 个答案:

答案 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)

您正在执行表明您的容器类型错误的操作。

  1. 您正在根据“第一个数组”的值对“第二个数组”进行排序,将数组维护为最佳排序
  2. 你是根据“第二个数组”的值拆分数组,如果它们之间有链接会很好
  3. 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);
        }
    }
    

    Live Example