2014-01-06 2 views
0

두 개의 벡터 배열로 구성된 구조가 있습니다.첫 번째 벡터 요소를 기준으로 구조를 정렬

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

나는 그런 방법 end_time 점에서 start_time O를 기준으로 구조를 정렬 할 수 있습니다. 일예를 들어 ,

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 

는이 점에서 나를 인도 해주십시오.

대신 벡터 arrarys 선언의 난이 사용하는 경우 나, 한 가지 더 발견

감사 :

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

또한 서버 내 목적으로하지만 지금 내가 가지고있는 것입니다 시간을 [0] 대신 START_TIME의 [ 0] 및 end_time [0]. 하지만 h [i] .start_time은 정렬하지만 h [i] .end_time은 정렬하지 않는 것과 동일한 문제가 있습니다. 나는 tony의 해결책처럼, 쌍을 사용하여 생각하려고 노력하고있다. 답장을 보내 주셔서 감사합니다.

+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 >은'pair'의'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는 구조체에이 두 벡터를 넣은 다음 일부 기초를 정렬하지 않으면 쉽게 작동하지 않습니다. –

관련 문제