C++ 使用另一个向量中的值对向量进行排序
我有一个名为C++ 使用另一个向量中的值对向量进行排序,c++,C++,我有一个名为foo_-vec的std::vector包含类foo的对象。假设Foo有一个成员变量intx,我还实现了一个函数CompareInts(inta,intb),它返回a和b中的最小值。然后,我可以根据对象的x值对向量进行std::sort排序 但是,如果这些x值不是Foo的成员变量,而是在另一个名为x_-vec的std::vector中,该怎么办。这里,x_-vec的第一个元素对应于foo_-vec的第一个元素,依此类推。如何根据x_-vec中的相应值对foo_-vec执行std::s
foo_-vec
的std::vector
包含类foo
的对象。假设Foo
有一个成员变量intx
,我还实现了一个函数CompareInts(inta,intb)
,它返回a
和b
中的最小值。然后,我可以根据对象的x
值对向量进行std::sort
排序
但是,如果这些
x
值不是Foo
的成员变量,而是在另一个名为x_-vec
的std::vector
中,该怎么办。这里,x_-vec
的第一个元素对应于foo_-vec
的第一个元素,依此类推。如何根据x_-vec
中的相应值对foo_-vec
执行std::sort
?创建int的第三个向量,它是原始两个向量的索引。首先用数字0填充第三个向量。。向量的长度。然后构造比较函数,从第三个向量获取索引,然后与包含键的第二个向量进行比较
第一个和第二个向量中的数据不会被修改(这很好),第三个向量中的值将表示完成后的排序顺序。您可以创建索引的第三个向量并间接进行排序。排序后,可以通过排序后的索引访问原始向量:
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";
}
std::vector foo_vec=/*…*/;
标准::向量x_vec=/*…*/;
std::向量索引;
断言(foo_vec.size()=x_vec.size());
对于(std::size_t i=0;i!=foo_vec.size();++i){index_vec.push_back(i)}
排序(
索引向量开始(),索引向量结束(),
[&](std::size_t a,std::size_t b){返回x_vec[a] std::是否有保持x_-vec
顺序的要求?不,如果x_-vec
重新排序就可以了。我投票结束这个问题,因为它缺少一个最小的示例。这种技术被称为“并行阵列”它和FORTRAN一样古老,还没到结构时代。正如你所注意到的,它可能会很尴尬。这里有一个很好的算法,用于基于indicatesfoo类对向量进行重新排序,需要重载´@Elyasin:当然,那只是为了演示如何访问元素。没关系。我认为这对你来说是基本的。刚才提到过,让其他人知道。E我必须说的是一个很好的例子。对我来说,它展示了lambda表达式的一个很好的用例。竖起大拇指。@KerrekSB似乎index\u-vec
不是使用x\u-vec
排序的,而是使用它自己的成员。这不就是让index\u-vec
保持不变吗?