我有一个名为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
?
答案 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填充第三个向量。向量的长度。然后构造你的比较函数,从第三个向量中获取索引,然后对持有键的第二个向量进行比较。
第一个和第二个向量中的数据不会被修改(这是好的),第三个向量中的值将表示完成后的排序顺序。