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

Sorting a vector using values in another vector

本文关键字:向量 一个 排序 另一个      更新时间:2023-10-16

我有一个名为foo_vecstd::vector,其中包含类Foo的对象。假设Foo有一个成员变量int x,我还实现了一个函数CompareInts(int a, int b),它返回ab的最小值。然后,我可以做一个std::sort,即根据对象的x值的向量。

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

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

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";
}

请注意,这种操作完全是非侵入性的,因为一切都是间接发生的。

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

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