Я получаю std :: logic_error 'what (): basic_string :: _ M_construct null not valid, когда я запускаю функцию sort_string с циклом for, но не с простым оператором отношения для сравнения двух строк. Программа строит наибольшее число из вектора заданных чисел. Для небольшого ввода он работает нормально, но не для большого ввода. Я предоставил информацию ниже.

         #include<iostream>
         #include<string>
         #include<algorithm>
         #include<vector>

         bool sort_string(std::string x, std::string y) {

           std::string xy = x.append(y);
           std::string yx = y.append(x);


        //   For loop below, to calculate larger string gives "terminate called after throwing
        //   an instance of 'std::logic_error' what():  basic_string::_M_construct null not valid"
        //   Just comment the for loop and uncomment the last return statement to see


        //-------------------------------------------------------------------------------------------------------

         for (int i = 0; i < xy.size(); i++) {

              if (xy.at(i) > yx.at(i)) return true;
              if (yx.at(i) > xy.at(i)) return false;
         }
              return true;
       //-------------------------------------------------------------------------------------------------------

     /*
          This runs perfectly fine
     */

         //return xy>=yx;

        }
       
        int main() {
             int n;
             std::cin >> n;
             std::vector<std::string> arr(n);
             for (int i = 0; i < n; i++) {
                   std::cin>>arr[i];
             }
             std::sort(arr.begin(), arr.end(), sort_string);
             for (int i = 0; i < n; i++) {
                  std::cout << arr[i];
             }
             std::cout << std::endl;
         }

Инструкции: запустить с g ++ -std = c ++ 14

Вход:

100

2 8 2 3 6 4 1 1 10 6 3 3 6 1 3 8 4 6 1 10 8 4 10 4 1 3 2 3 2 6 1 5 2 9 8 5 10 8 7 9 6 4 2 6 3 8 8 9 8 2 9 10 3 10 7 5 7 1 7 5 1 4 7 6 1 10 5 4 8 4 2 7 8 1 1 7 4 1 1 9 8 6 5 9 9 3 7 6 3 10 8 10 7 2 5 1 1 9 9 5

0
dark_prince 1 Сен 2020 в 06:01

2 ответа

Лучший ответ

Проблема вызвана

return true;

В sort_string. Это должно быть

return false;

Когда вы дойдете до этой линии, xy равно yx. Следовательно, yx < xy равно false, а не true.

Линия

return xy >= yx;

Работает, потому что эта строка такая же, как

return yx < xy;
0
R Sahu 1 Сен 2020 в 03:40

Ваш код будет работать, просто изменив return true вне for loop на return false. Однако я не понимаю, почему вы так сильно усложняете этот код ТАК , когда можно просто сделать

bool sort_string(const std::string& x, const std::string& y)
{
  return x > y;
}

Или даже реализовать его как лямбду.

0
mgonnav 1 Сен 2020 в 03:29