lambda函数的C ++问题

时间:2017-11-03 12:28:24

标签: c++ sorting lambda unreal-engine4

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

我想对这些字符串进行排序:

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和B我想获得第一个数字,将其转换为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中使用该函数,因为它是一个本地函数,但我不知道如何修复它。

3 个答案:

答案 0 :(得分:2)

std::stoi documentation中所述:

  

丢弃任何空白字符(通过调用isspace()标识),直到找到第一个非空白字符,然后获取尽可能多的字符以形成有效的base-n(其中n = base)整数数字表示并将它们转换为整数值。

(重点是我的)它完成了你所需要的,所以你的lambda可以只是:

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

请注意,将字符串转换为整数并不是一个非常简单的操作,因此您可能需要重新组织数据,这样就不必多次对字符串执行此操作。

答案 1 :(得分:0)

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

这里有2个本地字符串变量,空(我想,不知道是什么&#39; s 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应该是一个自由函数,或者至少是一个静态成员函数,因为它的实现只取决于输入参数。

P.S。在问题评论中听@Slava,这可能会导致

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

答案 2 :(得分:0)

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

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?