직접적인 해결책이 될 수있다 : 그러나
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)보다 적은 비용으로이 문제를 해결할 수는 없다고 생각합니다.
가능한 복제본 http://stackoverflow.com/q/11341498/819272 – TemplateRex
두 가지 질문 (문제와 관련이 없지만 여전히 중요 함) : '0'에서 루핑을 시작하지 않으시겠습니까? 'vec2'와'vec1 [0]'의 크기가 같은지 확인 했습니까? 'etf_comp'의 크기가'vec2'의 크기보다 큰지 확인 했습니까? –
@JoachimPileborg 헤더를 건너 뛰기 위해 루프를 0에서 시작하지 않았습니다. 위의 코드를 수정했습니다. etf_comp를 vec2로 변경하는 것을 잊었습니다. – postelrich