C++ 仅使用绝对值对数组排序,并在C+中显示实际值+;

C++ 仅使用绝对值对数组排序,并在C+中显示实际值+;,c++,C++,打印绝对排序数组。请参见示例输出以获得澄清 input: arr = [2, -7, -2, -2, 0] output: [0, -2, -2, 2, -7] 现在我使用lambda函数作为STLstd::sort的比较器,但它没有给出正确的答案;如果您能帮忙,我们将不胜感激 代码: vector absSort(const vector&at) { 向量arr=at; 排序(arr.begin(),arr.end(),[&](常量int a,常量int b){ if(abs(a)abs(

打印绝对排序数组。请参见示例输出以获得澄清

input:  arr = [2, -7, -2, -2, 0]
output: [0, -2, -2, 2, -7]
现在我使用lambda函数作为STL
std::sort
的比较器,但它没有给出正确的答案;如果您能帮忙,我们将不胜感激

代码:

vector absSort(const vector&at)
{
向量arr=at;
排序(arr.begin(),arr.end(),[&](常量int a,常量int b){
if(abs(a)abs(b))返回1;
如果(ab)返回1;
返回0;
});
返回arr;
}

您的比较函数不正确。它必须返回一个布尔值,指示
a
b
的顺序是否正确

应该是这样的:

auto compare = [](int a, int b)
{
    int abs_a = abs(a), abs_b = abs(b);
    if (abs_a < abs_b) return true;
    if (abs_b < abs_a) return false;
    return a < b;
};
auto-compare=[](整数a、整数b)
{
int abs_a=abs(a),abs_b=abs(b);
如果(abs_a

注意:使用自动引用捕获(
[&]
)通常不是一个好主意,因为它很容易在lambda中意外引入副作用。我在我的示例中删除了这个,因为实际上不需要捕获任何东西。我们可以就风格进行辩论,但出于个人偏好,我总是将所有捕获明确,无论它们是通过引用还是通过值。

如果它的abs那么重要的是-2在2之前

#include <algorithm>
#include <functional>
#include <array>
#include <iostream>

int main()
{
    std::array<int, 6> s = { 2, -7, -2, -2, 0, 7 };

    // sort using a custom lambda
    std::sort(s.begin(), s.end(), [](int a, int b)
    {
        if (abs(a) == abs(b))
            return a < b;
        return abs(a) < abs(b);
    });

    for (auto a : s) {
        std::cout << a << " ";
    }
    std::cout << '\n';
    return 0;

}
#包括
#包括
#包括
#包括
int main()
{
数组s={2,-7,-2,-2,0,7};
//使用自定义lambda进行排序
std::sort(s.begin(),s.end(),[](int a,int b)
{
如果(abs(a)=abs(b))
返回astd::cout如果你想做一些简单的事情,只需添加cossine/2,结果对于负数有点下降,对于正数有点上升,并且不会造成整数部分,这对生产不好

  sort(arr.begin(), arr.end(), [](auto a, auto b){
      return abs(a + cos(a)/2.) < abs(b + cos(b)/2.);
  });
排序(arr.begin(),arr.end(),[](自动a,自动b){ 返回abs(a+cos(a)/2.

我还想知道Lamda函数如何与sort stl一起工作阅读您正在使用的std::sort的比较谓词版本的文档:--注意函数“返回”​如果第一个参数小于(即之前排序)第二个“,”函数不返回布尔值,那么实际上它总是返回true(非零),除非这两个值相等。C++不是C(我假设你从C代码中得到1, 0,-1)。您应该返回
true
false
,而不是1,0,-1。可能只是
{return abs(a)
?不,这与原始示例不同。当绝对值相等时,它会执行二次排序。@paddy
{return abs(a)
}<代码> > A==4</代码>和<代码> B=2 < /代码>。您的建议将导致<>代码> -4 < /代码>排序顺序比<代码> 2 < /代码>更短。很多人似乎犯了这种逻辑错误,尤其是对于版本测试之类的东西。在许多场合,我不得不联系第三方供应商WH。ose代码在主版本被碰撞后无法运行,正是由于这种错误。例如:
int foo=42;auto bar=[&]({++foo;};bar();
——当您使用
[&]
时,它将通过引用自动捕获
foo
,这意味着在您调用
bar()之后
foo
的值将是43。如果改用
[=]
,它将自动按值捕获
foo
,因此不会在lambda之外更改。如果使用
[]
将导致编译器错误。我个人的偏好是将其明确化:
[&foo]
。这意味着您完全希望通过引用捕获该值。请注意负数先出现的顺序,如输入为[2,-7,-2,-2,0,7],则o/p必须为[0,-2,-2,2,-7,7]对不起,你刚刚发明了lambdashere@YuriKovalenko阅读std::sort的API。我没有发明任何东西。有点粗鲁。我还将其修改为使用lambda。@PaulBaxter如果它看起来粗鲁,我很抱歉。我知道std::sort的API,您的代码完全正确,但我的评论是关于您使用一个重载的调用运算符,但这正是lambda所做的,但样板代码较少,我不认为有任何理由在这里使用显式结构而不是lambda
  sort(arr.begin(), arr.end(), [](auto a, auto b){
      return abs(a + cos(a)/2.) < abs(b + cos(b)/2.);
  });