2014-01-06 61 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將無法輕鬆工作,除非將這兩個向量放在一個結構中,然後在某種基礎上進行排序。 –

相關問題