使用另一个向量中的值对矢量进行排序

时间:2015-12-13 01:17:16

标签: c++

我有一个名为std::vector的{​​{1}}包含类foo_vec的对象。假设Foo有一个成员变量Foo,我还实现了一个函数int x,它返回CompareInts(int a, int b)a的最小值。然后,我可以根据对象的b值执行std::sort向量。

但是,如果这些x值不是x的成员变量,而是位于名为Foo的另一个std::vector中,那该怎么办?这里,x_vec的第一个元素对应x_vec的第一个元素,依此类推。如何根据foo_vec中的相应值在std::sort上执行foo_vec

2 个答案:

答案 0 :(得分:4)

您可以制作索引的第三个向量,并间接对其进行排序。排序后,您可以通过排序索引访问原始向量:

std::vector<Foo> foo_vec = /* ... */;
std::vector<int> x_vec = /* ... */;
std::vector<std::size_t> index_vec;

assert(foo_vec.size() == x_vec.size());
for (std::size_t i = 0; i != foo_vec.size(); ++i) { index_vec.push_back(i); }

std::sort(
    index_vec.begin(), index_vec.end(),
    [&](std::size_t a, std::size_t b) { return x_vec[a] < x_vec[b]; });

for (std::size_t i = 0; i != index_vec.size(); ++i)
{
    std::cout << "Sorted element " << i << " is "
              << foo_vec[index_vec[i]] << "\n";
}

请注意,此操作完全是非侵入性的,因为所有操作都是间接发生的。

答案 1 :(得分:2)

您创建int的第三个向量,它是原始两个向量的索引。最初用数字0填充第三个向量。向量的长度。然后构造你的比较函数,从第三个向量中获取索引,然后对持有键的第二个向量进行比较。

第一个和第二个向量中的数据不会被修改(这是好的),第三个向量中的值将表示完成后的排序顺序。