Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用另一个向量中的值对向量进行排序_C++ - Fatal编程技术网

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
保持不变吗?