我想在 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
不同位数的数字可以,但两位数的数字不排序。 请问是什么问题?
这是代码:
#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;
}
不使用任何奇怪的库,这就是正确的方法。用气泡法来排序就足够了。