一個簡單的解決方案可能是:
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)小的成本解決這個問題是不可能的。
可能的重複http://stackoverflow.com/q/11341498/819272 – TemplateRex 2012-07-12 06:07:46
幾個問題(與您的問題無關,但仍然很重要):爲什麼不開始在'0'循環?你確定'vec2'和'vec1 [0]'的大小是一樣的嗎?你確定'etf_comp'的大小比'vec2'大嗎? – 2012-07-12 06:14:31
@JoachimPileborg沒有開始在0循環跳過標題。修正了上面的代碼,忘了把etf_comp改成vec2。 – postelrich 2012-07-12 06:26:08