所以我有一个带有键作为字符串的映射,我想按字符串中的第一个值对该映射进行排序。
我想对这些字符串进行排序:
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中使用该函数,因为它是一个本地函数,但我不知道如何修复它。
答案 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
)。 left
和right
这里有两个要比较的键,您需要定义此比较来定义排序顺序。所以正确的版本是:
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?