2012-07-12 2 views
0

두 개의 2 차원 벡터가 있는데, 여기서 vector1은 첫 번째 행에 공통 값을 갖고 vector2는 두 번째 열에 공통 값을가집니다. vector1의 첫 번째 행에있는 값에 따라 vector2의 행을 정렬하려고합니다. 이 일을하는 가장 좋은 방법은 무엇입니까?다른 2D 벡터에 기초한 2 차원 벡터 정렬

for(unsigned int i = 1; i < vec2.size(); i++) 
    if(vec2[i][1] != vec1[0][i]) 
     swap(vec2[i], vec2[i + 1]); 
+0

가능한 복제본 http://stackoverflow.com/q/11341498/819272 – TemplateRex

+0

두 가지 질문 (문제와 관련이 없지만 여전히 중요 함) : '0'에서 루핑을 시작하지 않으시겠습니까? 'vec2'와'vec1 [0]'의 크기가 같은지 확인 했습니까? 'etf_comp'의 크기가'vec2'의 크기보다 큰지 확인 했습니까? –

+0

@JoachimPileborg 헤더를 건너 뛰기 위해 루프를 0에서 시작하지 않았습니다. 위의 코드를 수정했습니다. etf_comp를 vec2로 변경하는 것을 잊었습니다. – postelrich

답변

0

직접적인 해결책이 될 수있다 : 그러나

std::vector<std::vector<int>> v1 = { 
    { 3, 6, 4 }, 
    { 1, 1, 1 }, 
    { 1, 1, 1 } 
}; 
std::vector<std::vector<int>> v2 = { 
    { 1, 4, 1 }, 
    { 1, 6, 1 }, 
    { 1, 3, 1 } 
}; 

const std::vector<int>& order = v1[0]; 

std::sort(v2.begin(), v2.end(), [&order](
    const std::vector<int>& r1, const std::vector<int>& r2) { 
     auto it1 = std::find(order.begin(), order.end(), r1[1]); 
     auto it2 = std::find(order.begin(), order.end(), r2[1]); 
     return (it1 - it2) < 0; 
}); 

내가 정렬 알고리즘이 더 잘 할 수있는 몇 가지 방법이 있는지 궁금하지만 나는 지금까지 무엇을 가지고 있습니다 ,이 솔루션은 상당히 높은 비용, O (N^2 log N)을 가진다. 벡터의 크기에 따라 문제가 될 수도 있고 그렇지 않을 수도 있습니다.

또 다른 방법은 간접으로 중간 벡터를 사용하는 것입니다 :

std::vector<int> idxs(order.size()); 
for (std::size_t i = 0; i < order.size(); i++) 
    idxs[i] = std::find(order.begin(), order.end(), v2[i][1]) - order.begin(); 

// After computing the intermediate vector you could access v2 like this: 
v2[idxs[i]][j] 

이 솔루션은 약간의 오버 헤드 비용이 v2에 액세스 할 때마다에서 (N^2) 비용, O있다.

마지막으로 사용자 지정 정렬 솔루션을 제안 할 수 있습니다. 그래도 O (N^2)보다 적은 비용으로이 문제를 해결할 수는 없다고 생각합니다.

+0

베타 테스트 덕분에 첫 번째 질문에서 더 많은 평신도를 설명 할 수 있었습니까? 또한 두 번째 솔루션의 경우 idxs [i] = find (order.begin(), order.end(), ** v1 **) - order.begin(); ? – postelrich

+0

@riotburn 당신은'v1'에 대해 옳았습니다. 나는 고칠 것이다. 첫 번째 접근법은'sort' 함수를 사용합니다. 이 함수는 두 요소를 비교하기 위해 비교 함수 (이 경우에는 C++ 11 람다 함수를 사용함)를 사용할 수 있습니다. compare 함수는 요소가 'v1'의 첫 번째 행에있는 위치를 찾고 그 결과에 따라 전체'v2 '가 정렬됩니다. 'sort'가 어떻게 작동하는지 더 잘 이해하려면 [here] (http://en.cppreference.com/w/cpp/algorithm/sort)를보고보다 쉬운 문제를 생각해보십시오. – betabandido

+0

@riotburn 예를 들어, 문자열 길이에 따라 문자열 벡터를 정렬하는 방법을 생각할 수 있습니다. 이 경우 람다 함수는 다음과 같다 :'[] (const string & s1, const string & s2) {return s1.size() betabandido