对 c++ 向量<string>进行排序
Sorting c++ vector<string>
我想对练习的字符串向量进行排序。这些字符串只有从 0 到 9 的数字,如 [ 10 2 1 9 91 ],我想排序为 [ 9 91 2 1 10 ] 以达到最大的数字 ( 9912110 )。我使用 sort
函数执行了以下代码
#include <algorithm>
#include <sstream>
#include <iostream>
#include <vector>
#include <string>
using std::vector;
using std::string;
bool compare(string i1, string i2)
{
int a, b;
int i = 0;
int min_len = (i1.length() > i2.length()) ? i2.length(): i1.length();
while(i < min_len) {
a = (int) (i1.at(i) - '0');
b = (int) (i2.at(i) - '0');
if (a != b)
break;
i++;
}
if (a > b)
return true;
if (a < b)
return false;
if (i1.length() > i2.length())
return false;
return true;
}
int main() {
int n;
std::cin >> n;
vector<string> a(n);
for (size_t i = 0; i < a.size(); i++) {
std::cin >> a[i];
}
sort(a.begin(), a.end(), compare);
}
问题是当我使用参数执行时:
100
2 8 2 3 6 4 1 1 10 6 3 3 6 1 3 8 4 6 1 10 8 4 10 4 1 3 2 3 2 6 1 5 2 9 8 5 10 8 7 9 6 4 2 6 3 8 8 9 8 2 9 10 3 10 7 5 7 1 7 5 1 4 7 6 1 10 5 4 8 4 2 7 8 1 1 7 4 1 1 9 8 6 5 9 9 3 7 6 3 10 8 10 7 2 5 1 1 9 9 5
给我以下错误:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Aborted
但是如果我使用 99 执行并删除最后一个数字,它可以正常工作。如果我尝试超过 100(如 101 或 102 ......我想错误出在compare
函数中。
编辑:
bool compare(const std::string& i1, const std::string& i2)
{
int i = 0;
int min_len = (i1.length() > i2.length()) ? i2.length(): i1.length();
while (i < min_len) {
int a = (int) (i1.at(i) - '0');
int b = (int) (i2.at(i) - '0');
if (a > b)
return true;
if (a < b)
return false;
i++;
}
return (i1.length() < i2.length());
}
给定相
等的参数,std::sort
的比较函数应始终返回 false。但是您的函数返回 true。尝试以下修改
bool compare(string i1, string i2)
{
...
if (a > b)
return true;
if (a < b)
return false;
return i1.length() < i2.length();
}
我猜正在发生的事情是,当您的平台上,当要排序的序列大小为>= 100 时,在您的平台上std::sort
选择不同的算法。对于这种不同的算法,满足比较函数的要求至关重要。
虽然已经给出了实际问题的答案,但您的比较算法不适合获得所需的结果!
请考虑以下示例:
情况 1:[99, 991]
– 您需要先对较短的字符串进行排序以获得99991
而不是99199
。
情况 2:[91, 919]
– 您需要先对较长的排序以获得91991
而不是91919
。
虽然字典比较(这是您实现的)可以按公共长度对字符串进行排序,但如果字符串在其公共长度上比较相等,则标准"长度"不能用于决定首先对哪个字符串进行排序!
但是,您可以执行以下操作:
std::sort
(
a.begin(), a.end(),
[](std::string x, std::string y)
{
std::string xy = x + y;
std::string yx = y + x;
return xy > yx;
}
);
即首先对一个字符串进行排序,如果与另一个字符串连接,则在较大的值中产生。
相关文章:
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- EASTL矢量<向量<int>>连续的
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一