簡単な解決策は次のとおりです。
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]
このソリューションには O(N^2) のコストがかかりますが、アクセスするたびにオーバーヘッドが発生しますv2
。
最後に、独自の並べ替えソリューションを考え出すことができます。それでも、この問題を O(N^2) よりも小さいコストで解決することは不可能だと思います。