【问题标题】:Sorting a vector using values in another vector [duplicate]使用另一个向量中的值对向量进行排序[重复]
【发布时间】:2015-12-13 01:17:15
【问题描述】:

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

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

【问题讨论】:

  • x_vec的订单是否需要维护?
  • 不,如果x_vec被重新排序就好了。
  • 我投票结束这个问题,因为它缺少一个最小的例子。
  • 这种技术被称为“并行数组”,它与 FORTRAN 一样古老,在结构之前。如您所见,这可能很尴尬。

标签: c++


【解决方案1】:

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

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

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

【讨论】:

  • 这里有一个link 用于基于索引重新排序向量的好算法
  • Foo 类需要重载我认为的 ´
  • @Elyasin:当然,那只是为了演示如何访问元素。
  • 没关系。我认为这对你来说是基本的。刚刚提到让其他人知道。我不得不说的很好的例子。对我来说,它展示了一个非常好的 lambda 表达式用例。竖起大拇指。
  • @KerrekSB 似乎index_vec 不是使用x_vec 排序的,而是使用它自己的成员。这不会让index_vec 保持不变吗?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2012-07-05
    • 2016-09-19
    • 1970-01-01
    相关资源
    最近更新 更多