【问题标题】:Sorting in Structure on the basis of its first vector element基于其第一个向量元素在结构中排序
【发布时间】:2014-01-23 11:36:53
【问题描述】:

我有一个由两个向量数组组成的结构。

struct hotel {
  vector<int> start_time[1000],end_time[1000];
};

我必须以start_time 为基础对结构进行排序,使得end_time。 例如,

start_time[0] has 4 elements:
  start_time[0] = 12 10 8 9
  end_time[0]   = 100 20 30 50

start_time[1] has 5 elements:
  start_time[1] = 100 23 50 10 32
  end_time[1]   =  40 20 10 15 34

所以输出将是:

start_time[0] = 8 9 10 12
end_time[0]   = 30 50 20 100

start_time[1] = 10 23 32 50 100
end_time[1]   = 15 20 34 10 40

请在这方面指导我。

谢谢

我发现了另外 1 件事,如果我使用这个而不是声明向量数组:

struct hotel {
    vector<int> start_time,end_time;
}h[1000];

也将实现我的目的,但现在我有 h[0] 而不是 start_time[0] 和 end_time[0]。 但是有同样的问题如何排序 h[i].start_time 而不是 h[i].end_time。 我试图像托尼的解决方案一样思考,使用对。 谢谢你的回复。

【问题讨论】:

  • 我可以建议创建一个结构来保存 start_time 和 end_time 吗?看来你在那里有DataClump

标签: c++ sorting vector struct


【解决方案1】:
#include <algorithm>

// create a container storing associated pairs of start and end times...
std::vector<std::pair<int,int>> times;

for (int v = 0; v < 1000; ++v) // vector to be ordered on this iteration...
{
    assert(my_hotel.start_time[v].size() == my_hotel.end_time[v].size());

    // populate times...
    for (int i = 0; i < my_hotel.start_time[v].size(); ++i)
        times.push_back(std::make_pair(my_hotel.start_time[v][i], my_hotel.end_time[v][i]));

    // sort it...
    std::sort(times.begin(), times.end());

    // copy sorted data back into hotel structure...
    for (int i = 0; i < times.size(); ++i)
    {
        my_hotel.start_time[v][i] = times[i].first;
        my_hotel.end_time[v][i] = times[i].second;
    }

    times.clear();
}

上面可以用例如声明性的方式来完成。 std::copy 和 lambdas,但我个人认为这样做没有多大价值。

【讨论】:

  • @Nabla:“你正在制作一对两个向量”不,我不是 - std::vector&lt;std::pair&lt;int&gt;&gt;vectorpairs。我也看不出人口或最后一个循环有任何问题......我认为你完全误读了代码。如果不是,请解释....
  • @TonyD:我相信 Nabla 指的是您对std::make_pair 的电话。假设my_hotelhotel 类型的对象(OP 的结构),那么my_hotel.start_time[i]vector&lt;int&gt;my_hotel.end_time[i] 也是如此。除非您要更改 OP 结构的定义,否则您没有提及。
  • @BenjaminLindley:哦:-/。现在和你们两个。将修复 - 干杯。
【解决方案2】:

这是代码。

#include <iostream>
#include <vector>

using namespace std;

int main(int argc, const char * argv[])
{
    const int vectorSize = 2;
    vector<int> start_time[vectorSize];
    vector<int> end_time[vectorSize];

    //element at index 0
    start_time[0] = {12, 10, 8, 9};
    end_time[0]   = {100, 20, 30, 50};

    //element at index 1
    start_time[1] = {100, 23, 50, 10, 32};
    end_time[1]   =  {40, 20, 10, 15, 34};

    //Here is what you need
    //Make sure that both start_time and end_time have same size, which will be in this case
    for(int i = 0; i < vectorSize; i++) //This will work on start_time, end_time indexes
    {
        //This will sort each vectore - I am using bubble sort method
        for(int v = 0; v < start_time[i].size(); v++)
        {
            for(int k = 0; k < start_time[i].size() - 1; k++)
            {
                if(start_time[i][k] > start_time[i][k + 1])
                {
                    int temp = start_time[i][k];
                    start_time[i][k] = start_time[i][k + 1];
                    start_time[i][k + 1] = temp;

                    int temp2 = end_time[i][k];
                    end_time[i][k] = end_time[i][k + 1];
                    end_time[i][k + 1] = temp2;
                }
            }
        }
    }

    for(int i = 0; i < vectorSize; i++) 
    {
        cout<<"start_time["<<i<<"]: ";
        for(int k = 0; k < start_time[i].size(); k++)
        {
            cout<<start_time[i][k]<<" ";
        }

        cout<<endl;

        cout<<"end_time["<<i<<"]: ";
        for(int k = 0; k < end_time[i].size(); k++)
        {
            cout<<end_time[i][k]<<" ";
        }

        cout<<endl;

    }



    return 0;
}

【讨论】:

  • 你不应该自己写东西,标准库已经实现了。使用std::sort
  • 有时最好是了解基础知识,否则学不会编程。从问题来看,avinashse 也有同样的问题。
  • 对于这个特定的问题,std::sort 不起作用,有两个不同的向量,第二个向量作为第一个向量的从属。所以,std::sort 不会那么容易工作,除非你把这两个向量放在一个结构中,然后在某些基础上进行排序。
  • 您只需将它们临时放入成对向量或映射中。我还假设 OPs 问题不是关于排序算法,而是关于一个实际问题。不过我可能错了。
  • 是的,您建议的方法是一个很好的方法。这是关于根据 start_time 进行排序的。
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 2022-12-18
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 2014-03-02
  • 2017-04-05
  • 1970-01-01
相关资源
最近更新 更多