Мне нужно проанализировать числа из строки и отсортировать вектор в возрастающем диапазоне для первого числа и, если первые числа равны, по вторым числам в алфавите c порядок, как строки: [1, 250; 2, 30; 4, 40; 1, 26]
-> [1, 250; 1, 26; 2, 30; 4, 40]
.
Как «250» <«26», массив отсортирован как раньше. <br>
Есть алгоритм:
#include<assert.h>
#include<vector>
#include<string>
int sum_digits(int a);
string orderWeight()
{
vector<pair<int, int> > weight_number;
string str = "103 123 4444 99 2000 ";
string Numbers = "1234567890";
int Num;
for (auto i_beg = str.cbegin(); i_beg < str.cend(); ++i_beg)
{
if (Numbers.find(*i_beg) != string::npos)
for (auto i_end = i_beg + 1; i_end < str.cend(); ++i_end)
{
if (Numbers.find(*i_end) == string::npos)
{
Num = stoi(string(i_beg, i_end));
weight_number.emplace_back(sum_digits(Num)/*This function count sum of digits*/, Num);
i_beg = i_end;
break;
}
}
}
sort(weight_number.begin(), weight_number.end(),
[](const pair<int, int>& a, const pair<int, int>& b) -> bool {
if (a.first != b.first)
return a.first < b.first;
string s1 = to_string(a.second);
string s2 = to_string(b.second);
bool res = s1.compare(s2) < 0;
return res;
});
string result;
for (auto El: weight_number)
{
result += to_string(El.second) + " ";
}
result.pop_back();
return result;
}
int sum_digits(int a)
{
int sum = 0;
for (; a > 0; a /= 10)
{
sum += a % 10;
}
return sum;
}
int main ()
{
assert(orderWeight()=="2000 103 123 4444 99")
return 0;
}
На g cc все работает хорошо, но компилятор clang выдает ошибку :
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==1==ERROR: UndefinedBehaviorSanitizer: stack-overflow on address 0x7ffc35a59000 (pc 0x7f6029c2bb1f bp 0x000000001fff sp 0x7ffc35a562a8 T1)
==1==WARNING: invalid path to external symbolizer!
==1==WARNING: Failed to use and restart external symbolizer!
#0 0x7f6029c2bb1e (/lib/x86_64-linux-gnu/libc.so.6+0x18eb1e)
#1 0x7f602a60a137 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x13d137)
#2 0x7f602a5f9432 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x12c432)
#3 0x42be9d (/workspace/test+0x42be9d)
#4 0x42b9a2 (/workspace/test+0x42b9a2)
#5 0x425660 (/workspace/test+0x425660)
#6 0x4258b7 (/workspace/test+0x4258b7)
#7 0x42838c (/workspace/test+0x42838c)
#8 0x426a9e (/workspace/test+0x426a9e)
#9 0x426622 (/workspace/test+0x426622)
#10 0x4261db (/workspace/test+0x4261db)
#11 0x42b5a5 (/workspace/test+0x42b5a5)
#12 0x42573d (/workspace/test+0x42573d)
#13 0x7f6029abeb96 (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
#14 0x404679 (/workspace/test+0x404679)
==1==ABORTING
Если я прокомментирую if(..)
, или напишу res=true
, или s1="Something"
, или s2 ="Something"
без to_string(.second)
, эта ошибка исчезнет. Но программа работает как раз наоборот. Я уже ищу в поисковой системе безрезультатно.
Что мне делать, чтобы удалить эту ошибку в компиляторе clang?