繁体   English   中英

Lambda函数的C ++问题

[英]C++ issue with lambda function

因此,我有一个键为字符串的映射,我想按字符串中的第一个值对该映射进行排序。

我想对字符串进行排序:

10 - 20
40 - 50
60 - 80
200 - 400
420+

我还有另外几张地图,按字母顺序排序。 但这在这种情况下不起作用,因为它将按首字母排序,因此它将变为:

10 - 20
200 - 400
40 - 50
60 - 80
420+

我显然不想要。

我通常这样排序:

dropdowncategory.KeySort([](const string& A, const string& B) {
    return A.Compare(B, ESearchCase::IgnoreCase) < 0;
});

简单。

但是在这种情况下,希望从A和BI获得第一个数字,将其转换为int并对其进行排序。

因此,我要做的是编写了一个函数(尚无法测试,但是它应该从字符串中获取第一个数字,这不是问题。):

int GetIntFromString(string s) {
    int value = 0;
    string L, R;
    if (s.Contains("-")) {
        s.Split("-", &L, &R);
    }
    else{
        s.Split("+", &L, &R);
    }
    value = FCString::Atoi(*L); 
    return value;
}

通过此函数,我将获得字符串中的第一个数字。 然后,我想对结果进行排序。

我尝试了以下内容:

dropdowncategory.KeySort([](const string& A,const string& B) {
    return GetIntFromString(A) < GetIntFromString(B);
});

和:

string SA, SB;
dropdowncategory.KeySort([SA,SB](string& A, string& B) {
    return GetIntFromString(SA) < GetIntFromString(SB);
});

但是我一直在KeySort的返回值中获取GetIntFromString函数并出错:

除非在捕获列表中,否则无法在lambda主体中引用错误(有效)的封闭函数局部变量。

我不确定为什么。

我猜我不能在KeySort中使用该函数,因为它是本地函数,但我不知道如何解决。

std::stoi 文档中所述

丢弃所有空白字符(通过调用isspace()进行标识),直到找到第一个非空白字符为止, 然后使用尽可能多的字符来形成有效的以n为基(其中n = base)的整数表示并将其转换为一个整数值。

(重点是我的)它已经完成了您需要的工作,因此您的lambda可以是:

dropdowncategory.KeySort([](const string& A,const string& B) {
    return std::stoi(A) < std::stoi(B);
});

请注意,将字符串转换为整数不是很简单的操作,因此您可能需要重新组织数据,因此不必为该字符串执行太多次。

FString SA, SB;
dropdowncategory.KeySort([SA,SB](FString& A, FString& B) {
    return GetIntFromString(SA) < GetIntFromString(SB);
});

在这里,您有2个本地字符串vars,为空(我想,不知道什么是FString )。 您提供一个lambda作为排序功能。 通常,此类函数应具有签名bool(const Key& left, const Key& right) ,而您的lambda 几乎满足了这一要求(注意const )。 leftright ,这里将是两个键进行比较,您需要定义这个比较来定义排序顺序。 因此正确的版本是:

dropdowncategory.KeySort([](const FString& A, const FString& B) {
    return GetIntFromString(A) < GetIntFromString(B);
});

这仍然不能解释您的错误,主要是因为我不知道错误是什么。

顺便说一下, GetIntFromString应该是一个自由函数,或者至少是一个静态成员函数,因为它的实现仅取决于输入参数。

PS在问题注释中收听@Slava,这可能导致

dropdowncategory.KeySort([](const FString& A, const FString& B) {
    return std::atoi(*A) < std::atoi(*B);
});

您可以尝试表达您的意图:将条目视为一对整数,并为此使用现有的排序逻辑:

std::vector<std::tuple<int, int>> pairs;
std::transform(begin(dropdowncategory), end(dropdowncategory),
  std::back_inserter(pairs),
  [](auto s){
     std::stringstream ss(s);
     int i; ss >> i;
     char dummy; ss >> dummy;
     int j; ss >> j;
     return std::make_tuple(i, j);
  });
std::sort(begin(pairs), end(pairs)); // 30, 50 will come before 200, 210

// convert pairs back to strings?    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM