字符串向量中整数的自定义比较器

问题描述 投票:0回答:1

我想在 C++ 中按升序对表示非常大(10**6 digits)的字符串向量进行排序。 我正在尝试使用自定义比较器,但在比较相同位数的数字时排序失败,例如。未能重新排列 82 和 44。

这是一个小例子:

#include <bits/stdc++.h>
#include <string>
#include <algorithm>
#include <vector>

using namespace std;

string ltrim(const string &);
string rtrim(const string &);

bool comp(const string &left, const string &right)
{
    if (left.size() < right.size())
    {
        return true;
    }
    if (left.size() > right.size())
    {
        return false;
    }

    for (unsigned long int i = 0; i < left.size(); i++)
    {
        if (left[i] > (right[i]))
        {
            // left is bigger
            return false;
        }
    }
    // left is smaller or equal
    return true;
}

int main(void)
{
    vector<string> str_nums = {"82", "44", "131", "2"};

    sort(str_nums.begin(), str_nums.end(), comp);

    for (string e : str_nums)
    {
        cout << e << endl;
    }
    return 0;
}

输出:

2
82
44
131

不同位数的数字可以,但两位数的数字不排序。 请问是什么问题?

c++ sorting
1个回答
0
投票

这是代码:

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

bool compare_numstrings(const std::string &left, const std::string &right) {
    if (left.size() < right.size()) {
        return true;}
    else if (left.size() > right.size()) {
        return false;}
    else {
        for (long int i = 0; i < left.size(); i++) {
            if (left[i] < right[i]) {
                return true;}
            else if (left[i] > right[i]) {
                return false;}
            else {continue;}}
        return true;} // return true when numbers are equal.
};

std::vector<std::string> sort_numstrings(std::vector<std::string> v_original) {
    std::string aux;
    for (long int j = 0; j < v_original.size() - 1; j++) {
        for (long int i = 0; i < v_original.size() - 1; i++) {
            if (!compare_numstrings(v_original[i], v_original[i + 1])) {
                aux = v_original[i];
                v_original[i] = v_original[i + 1];
                v_original[i + 1] = aux;}}}
    return v_original;
};

int main() {
    std::vector<std::string> str_nums = {"132", "44", "82", "2", "441"};
    str_nums = sort_numstrings(str_nums);
    for (std::string e: str_nums) {
        std::cout << e << "\n";}
    return 0;
}

不使用任何奇怪的库,这就是正确的方法。用气泡法来排序就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.