是否可以使用std :: sort按字典顺序排序?

时间:2015-01-31 17:30:19

标签: c++ sorting

我的问题看起来像这样:

  1. 一开始你必须插入一定数量的数字。
  2. 下一个程序计算您在第一步中插入的数字的总和。
  3. 所有分数都插入名为vec
  4. 的矢量中

    问题是:在程序结束时,您在步骤1中插入的​​所有数字必须按其数字总和排序(按递增顺序排序)。

    请注意!例如,如果两个数字(例如123和12300)具有相同的数字总和,则必须按字典顺序对它们进行排序。

    我不想自己创建函数构建但是我想从库中使用“sort”函数但是我有问题..是否可以使用sort函数来按字典顺序排序?有人可以帮助我吗? 示例输入:

    6 
    13
    36
    27
    12
    4
    123
    

    预期产出:

    12
    13
    4
    123
    27
    36
    

    我的代码:

    #include<iostream>
    #include<cmath>
    #include<string>
    #include<vector>
    #include<sstream>
    #include<algorithm>
    using namespace std;
    
    int main()
    {
        vector<vector<int> > vec;
        int num;
        int n;
        cin >> n;
    
        for (int i = 0; i < n; i++)
        {
            cin >> num;
            vector<int> row;
    
            row.push_back(num);
    
            //conversion int to string:
            ostringstream ss;
            ss << num;
            string str = ss.str();
    
            int sum = 0;
            for (int g = 0; g < str.length(); g++){
                int pom = str[g] - '0';
                sum += pom;
            }
    
            row.push_back(sum);
            vec.push_back(row);
            row.clear();
        }
    
        //sort(vec[0][0], vec[vec.size()][0]);
    
        for (int i = 0; i < vec.size(); i++){
            for (int j = 0; j < 2; j++){
                //cout << vec[i][j] << " ";
            }
            cout << vec[i][0] << endl;
        }
    
    
    
        system("pause");
        return 0;
    }
    

3 个答案:

答案 0 :(得分:2)

您可以将每个数字存储为字符串,但也可以预先计算其数字和,并将其保存在pair<int,string>中,然后将它们放入vector<pair<int,string>sort不需要自定义比较器std::pair的那个就完全符合您的要求。

// note: std::pair<std::string,int> would not work
typedef std::pair<int,std::string> number;
std::vector<number> numbers;

// fill numbers such that number::first holds the digit sum
// and number::second the number as string.
// this is similar to your code

std::sort(numbers.begin(), numbers.end());

// now numbers are ordered as you want them

答案 1 :(得分:2)

只需将合适的比较函数(或函子,例如lambda就是自然的)传递给std::sort

答案 2 :(得分:1)

由于您希望首先比较数字之和,然后按字典顺序比较以断开关系,因此将输入数字转换为字符串会很方便。

从那里你可以定义一个自定义比较器来实现所需的行为:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int sumDigits(string s)
{
    int sum = 0;
    for (unsigned int i=0; i<s.length(); ++i)
    {
        sum += s[i] - '0';
    }
    return sum;
}

bool digitSumComparator(int i, int j)
{
    int iSum = sumDigits(to_string(i));
    int jSum = sumDigits(to_string(j));
    if (iSum == jSum)
    {
        return iStr < jStr;
    }
    else
    {
        return iSum < jSum;
    }
}

int main()
{
    vector<int> v {6,13,36,27,12,4,123};
    sort(v.begin(), v.end(), digitSumComparator);
    for (vector<int>::iterator it=v.begin(); it!=v.end(); ++it)
    {
        cout <<  *it << ' ';
    }
    cout << '\n';
    return 0;
}

输出:

$ g++ -std=c++11 digitsumsort.cpp
$ ./a.out
12 13 4 123 6 27 36