C++:如何按数字顺序对数字字符串向量进行排序?

C++: How can I sort a string vector of numbers in numerical order?

在我的程序中,我有一个通过用户输入填充的空字符串向量。该程序旨在从用户输入中获取数字,然后按从小到大的顺序对这些数字进行排序(数据类型为字符串,以便于检查不需要的输入,例如空格、字母、标点符号等)。事实上,程序根据起始数字而不是大小对数字进行排序。我如何更改程序以按我想要的方式排序?

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

using namespace std;

int main()
{
    vector<string> vect;
    string input;
    int intInput;
    int entries = 0;
    int i = 0;
    int x = 0;

    while (x < 1)
    {
        i++;
        cout << "Please input an integer. When finished providing numbers to organize, 
                         input any character that isn't an integer:\n";
        vect.resize(i+1);
        getline(cin, input);
        cout << endl;

        stringstream ss(input);
        if (ss >> intInput)
        {
            if (ss.eof())
            {
                vect.push_back(input); 
                entries++;
            }
            else
            {
                cout << "Error: Invalid input.\n\n";
            }
        }   
        else if (entries < 1)
        {
            cout << "Error: Invalid input.\n\n";
            i = -1;
            continue;
        }   
        else if (entries >= 1)
        {
            break;
        }       
    }
    
    cout << "All done? Organizing numbers!\n";
    
    sort(vect.begin(), vect.end());
    
    for (int j = 0; j < vect.size(); j++)
    {   
        cout << vect[j] << endl;
    }
    
    return 0;
}

我试过各种方法将字符串数据转换成int数据,比如lexical cast & stoi(),但是都没有用,所以我想知道是否有其他方法,比如排序不改变数据类型的数据。

您可以指定一个比较函数,returns第一个参数是否“小于”std::sort函数的第二个参数。

在测试时,我发现一些使 std::stoi 抛出 std::invalid_argument 的空字符串被推入向量(看起来像 vect.resize(i+1);)。因此,我添加了一些代码来检测错误并将无效字符串评估为小于任何有效整数。

sort(vect.begin(), vect.end(), [](const string& a, const string& b) {
    bool aError = false, bError = false;
    int aInt = 0, bInt = 0;
    try {
        aInt = stoi(a);
    } catch (invalid_argument&) {
        aError = true;
    }
    try {
        bInt = stoi(b);
    } catch (invalid_argument&) {
        bError = true;
    }
    if (aError && !bError) return true;
    if (bError) return false;
    return aInt < bInt;
});
#include <stdexcept>

应添加使用std::invalid_argument

参考文献:

vect 开头有两个字符无法转换为字符串。这是您的相同代码,只是添加了 +2。

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

using namespace std;

int main()
{
    vector<string> vect;
    string input;
    int intInput;
    int entries = 0;
    int i = 0;
    int x = 0;

    while (x < 1)
    {
        i++;
        cout << "Please input an integer. When finished providing numbers to organize, input any character that isn't an integer:\n";
        vect.resize(i+1);
        getline(cin, input);
        cout << endl;

        stringstream ss(input);
        if (ss >> intInput)
        {
            if (ss.eof())
            {
                vect.push_back(input); 
                entries++;
            }
            else
            {
                cout << "Error: Invalid input.\n\n";
            }
        }   
        else if (entries < 1)
        {
            cout << "Error: Invalid input.\n\n";
            i = -1;
            continue;
        }   
        else if (entries >= 1)
        {
            break;
        }       
    }
    
    cout << "All done? Organizing numbers!\n";
    
    sort(vect.begin() + 2, vect.end()); //added 2 here
    
    for (int j = 2; j < vect.size(); j++) //iterating from 2
    {   
        cout << vect[j] << endl;
    }
    
    return 0;
}

它适用于我的 linux,希望它也适用于你的