2014-01-06 36 views
0

我有一个由两个向量数组组成的结构。根据其第一个向量元素排序结构

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两件事,如果不是宣告矢量arrarys我用这个:

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的问题相同。 我想像托尼的解决方案,使用一对。 感谢您的答复。

+1

我可以建议做一个结构来保存start_time和end_time吗?看来你在那里有[DataClump](http://martinfowler.com/bliki/DataClump.html)。 –

回答

2
#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,但我个人没有看到这么做的价值。

+0

@Nabla:“你正在制作一对两个矢量”不,我不是 - 'std :: vector >'是'对'的'矢量'。我看不到任何人口问题或最后一个循环......我认为你完全误读了代码。如果没有,请解释.... –

+0

@TonyD:我相信Nabla指的是你对'std :: make_pair'的调用。假设'my_hotel'是'hotel'类型的对象(OP的结构体),那么'my_hotel.start_time [i]'是'vector ','my_hotel.end_time [i]'也是''。除非你正在改变你没有提到的OP结构的定义。 –

+0

@BenjaminLindley:哦: - /。现在和你们在一起。将修复 - 欢呼声。 –

0

这是代码。

#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; 
} 
+0

你不应该自己写一些已经在标准库中实现的东西。使用'std :: sort'。 – Nabla

+0

有时最好了解基础知识,否则你不会学习编程。从这个问题来看,avinashse也有同样的问题。 –

+0

对于这个特定的问题,std :: sort将不起作用,有两个不同的向量,第二个向量作为第一个向量的从属。所以,std :: sort将无法轻松工作,除非将这两个向量放在一个结构中,然后在某种基础上进行排序。 –

相关问题