Переполнение в лямбда-функции в C ++ - PullRequest
0 голосов
/ 27 мая 2020

Я решал вопрос по leetcode. Вопрос в следующем: учитывая список неотрицательных целых чисел, расположите их так, чтобы они составляли наибольшее число. У меня есть алгоритм для написания функции компаратора и сортировки списка на основе этого. Я написал следующее:

 string largestNumber(vector<int>& nums) {
    auto comp = [&] (string &a, string &b){
       return a+b>=b+a;
    };
    vector<string>s;
    for(auto x:nums)    s.push_back(to_string(x));
    sort(s.begin(),s.end(),comp);
    string ans="";
    for(auto x:s)   ans+=x;
    if(ans[0]=='0') return "0";
    return ans;
}

Я получал сообщение об ошибке времени выполнения,

Line 431: Char 55: runtime error: pointer index expression with base 0xbebebebebebebebe overflowed to 0x7d7d7d7d7d7d7d7c (basic_string.h)

Но я обнаружил, что в операторе возврата лямбда-функции для сравнения двух строк, если я заменю «> = » на «> », я получу правильный ответ, и он будет принят. Могу ли я узнать, что не так при сравнении по знаку «> = »? Я понимаю, что оператор '>' сравнивает строки и выводит их в порядке убывания, но мне любопытно узнать причину ошибки.

1 Ответ

3 голосов
/ 27 мая 2020

Если открыть документацию по std::sort, вы увидите следующее:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

...

Требования к типу

  • Compare должны соответствовать требованиям Сравнить .

И Сравнить Требования говорят:

Устанавливает строгое слабое упорядочение связь со следующими свойствами

  • Для всех a, comp(a,a)==false

Ваш компаратор не соответствует этому требованию, потому что если вы передадите ему две равные строки, он вернет true, а не false.

Также обратите внимание, что первая ссылка говорит о том, что использование T & в качестве параметра компаратора не допускается. Вы должны использовать const T &.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...