C++ 使用C+中的另一个向量对一个向量进行Lambda排序+;

C++ 使用C+中的另一个向量对一个向量进行Lambda排序+;,c++,sorting,stdvector,C++,Sorting,Stdvector,我试图使用对应的双向量x_值对向量x2中的int索引列表进行排序。我在x2上使用std::sort,使用一个查看x_值的比较器。然而,输出不是我所期望的,我不知道为什么 下面是一些示例代码来说明我所说的内容: #include <iostream> #include <string> #include <vector> #include <numeric> #include <algorithm> int main() { i

我试图使用对应的双向量x_值对向量x2中的int索引列表进行排序。我在x2上使用std::sort,使用一个查看x_值的比较器。然而,输出不是我所期望的,我不知道为什么

下面是一些示例代码来说明我所说的内容:

#include <iostream>
#include <string>
#include <vector>
#include <numeric>
#include <algorithm>

int main()
{
    int numParticles = 2;
    std::vector<double> x_values(4);

    std::vector<int> x2(4);

    std::iota(x2.begin(), x2.begin() + numParticles, 0);
    std::iota(x2.begin() + numParticles, x2.end(), 0);

    x_values = { -0.3,-0.2,-0.1,1.0 };

    std::cout << "\nx values presort: \n";
    for (int i = 0; i < 4; i++) {
        std::cout << x_values[i] << " " << x2[i] << "\n";
    }

    std::sort(x2.begin(), x2.end(), [&x_values](int i1, int i2) {return x_values[i1] < x_values[i2]; });

    std::cout << "\nx index post sort: \n";
    for (int i = 0; i < 4; i++) {
        std::cout << x2[i] << "\n";
    }
}
而第二个输出为:

x index post sort: 
0
0
1
1
x index post sort: 
0
1
0
1
我希望第二次会议的结果是:

x index post sort: 
0
0
1
1
x index post sort: 
0
1
0
1

有人能看出我做错了什么吗?

x2
中的值
0
被排序为
x\u值[0]
aka
-0.3

x2
中的值
1
被排序为
x_值[1]
aka
-0.2

因此,排序后的向量是
0.1 1
,对应于
-0.3-0.3-0.2-0.2

我不理解你的困惑,你为什么期待别的东西


让我重新表述一下比较器的功能:


i1
from
x2
排在
i2
from
x2
if
x_值[i1]

我本来希望第二个的输出是:0 1 0 1为什么?在你对x2进行排序之后,它现在是一个升序。如果我只是对x2进行排序而没有lambda函数,我会同意的。我看到的结果可能是lambda函数没有被调用,但可能是lambda没有按照我的预期工作。我希望x2按x_值的升序排序,而不是x2的升序。它按x_值的升序排序-
x_值[0]、x_值[0]、x_值[1]、x_值[1]
?如果您不解释为什么希望
0,1,0,1
我希望使用x_值向量中包含的值而不是它们的索引来进行比较,那么我们就不能说您做错了什么。我期望的是0,1,0,1,因为x_值内部的双精度是{-0.3,-0.2,-0.1,1.0}。x2中的对应值为{0,1,0,1}。这有意义吗?@TimothyArtz在你的lambda中,
i1
i2
总是
0
1
我现在明白了。我对C++很陌生。我不理解lambda函数是如何工作的。我认为放入
i1
i2
的四个值将是
0 1 2 3
,对应于
-0.3-0.2-0.1 1.0
。您向我展示的是放置在
i1
i2
中的值是
x2[0]x2[1]x2[2]x2[3]
,这当然是
0 1
。要得到我想要的结果,我需要做的是做另一个向量,比如说
x3
,然后给它赋值
0 1 2 3
。然后我可以运行排序,它将返回
0 1 2 3
。然后我可以使用该结果重新排列
x2
以获得
011
谢谢!我仍然不明白你想实现什么,但是当你使用3个向量进行1种排序时,你就太复杂了。我有一组实值,对应于1D空间中某些对象的起始和结束坐标。我需要得到按坐标值排序的对象索引的顺序。在本例中,对象0从[-0.3,-0.1]开始,对象1从[-0.2,1.0]开始。通过对起点和终点进行排序,我可以观察到两个对象在[-0.2,-0.1]上重叠。它是扫描和修剪宽相位碰撞检测算法的一部分,更多信息如下:。如果你想用更少的向量,我会感兴趣的。@TimothyArtz我会用1个向量
struct X{double coord;int obj;}