2015-07-09 4 views
2

Я пытаюсь сортировать вектор строк на основе пользовательской функции сравнения -:Ошибка выполнения сортировки с пользовательским компаратором

#include<bits/stdc++.h> 
using namespace std; 

template<typename T> 
std::string ToString(const T& obj) 
{ 
    std::stringstream ss; 
    ss << obj; 
    return ss.str(); 
} 

bool comp(string num1, string num2) 
{ 
    bool swapped = false; 

    if (num2.size() > num1.size()) 
    { 
     swap(num1, num2); 
     swapped = true; 
    } 

    size_t i = 0; 
    size_t j = 0; 

    while (i < num1.size() && j < num2.size()) 
    { 
     if (num1[i] > num2[j]) 
     { 
      return !swapped; 
     } 
     else if (num1[i] < num2[j]) 
     { 
      return swapped; 
     } 

     i++; 
     j++; 
    } 

    j = 0; 

    while (i < num1.size() && j < num1.size()) 
    { 
     if (num1[i] > num1[j]) 
     { 
      return !swapped; 
     } 
     else if (num1[i] < num1[j]) 
     { 
      return swapped; 
     } 

     i++; 
     j++; 
    } 

    return true; 
} 

string largestNumber(vector<int>& nums) 
{ 
    vector<string> numsString(nums.size()); 

    for (size_t i = 0; i < numsString.size(); i++) 
    { 
     numsString[i] = ToString(nums[i]); 
    } 

    string result; 
    sort(numsString.begin(), numsString.end(), comp); 

    for (size_t i = 0; i < numsString.size(); i++) 
    { 
     result += numsString[i]; 
    } 

    return result; 
} 

int main() 
{ 
    // Works okay if the size of vector is less than 17 
    vector<int> nums(17, 0); 
    largestNumber(nums); 
} 

Я использую TDM-GCC 4.9.2 с -std=c++14 флагом на Windows-64 -немного.

Я получаю ошибку времени выполнения каждый раз, когда размер входного вектора больше 16.
Что я делаю неправильно?

+0

Не знаю. Всякий раз, когда я запускаю программу, появляется диалоговое окно с надписью «* ». Проблема привела к тому, что программа перестала работать правильно. Пожалуйста, закройте программу. '* –

+0

Нет. Я раньше не использовал, и я не знаю, как ее использовать. –

+1

Определение ToString может быть полезно. – lisyarus

ответ

6

Все элементы в вашем vector<string> numsString в конечном итоге, то же значение 0 преобразуется в строку:

vector<int> nums(17, 0); 
//     ^

И в вашей comp функции, вы не проверять, если числа равны.
Добавьте это также в верхней части функции:

if (num1 == num2) return false; 
+1

Эта проверка в верхней части, равны ли строки, будет просто тратить время и скрыть ** часть ** более фундаментальной проблемы. Общее сравнение должно избегать всех случаев, когда оба A JSF

+0

@JSF Это правда. –

Смежные вопросы