基于另一个2d向量排序2d向量

时间:2012-07-12 06:02:45

标签: c++ sorting stl vector

所以我有两个2d向量,其中vector1在第一行中具有公共值,而vector2在第二列中具有公共值。我想根据vector1第一行中的值对vector2中的行进行排序。这是最好的方法吗?

这是我到目前为止所得到的,但我想知道是否有一些方法可以更好地使用排序算法:

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

1 个答案:

答案 0 :(得分: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]

此解决方案的成本为O(N ^ 2),每次访问v2时都会产生一些开销。

最后,您可以尝试提供自定义排序解决方案。尽管如此,我认为以低于O(N ^ 2)的成本解决这个问题是不可能的。