C++ 字符串排序像人类一样吗?

2023-11-24

我想按照人类对字母数字字符串进行排序的方式对其进行排序。即,“A2”位于“A10”之前,“a”当然位于“Z”之前!有没有什么方法可以不写迷你解析器?理想情况下,它还会将“A1B1”放在“A1B10”之前。我看到问题了“Microsoft SQL 2005 中的自然(人类字母数字)排序”有一个可能的答案,但它使用各种库函数,就像“使用 IComparer 对人类字符串进行排序”.

以下是当前失败的测试用例:

#include <set>
#include <iterator>
#include <iostream>
#include <vector>
#include <cassert>

template <typename T>
struct LexicographicSort {
  inline bool operator() (const T& lhs, const T& rhs) const{
    std::ostringstream s1,s2;
    s1 << toLower(lhs); s2 << toLower(rhs);
    bool less = s1.str() < s2.str();
    //Answer: bool less = doj::alphanum_less<std::string>()(s1.str(), s2.str());
    std::cout<<s1.str()<<" "<<s2.str()<<" "<<less<<"\n";
    return less;
  }

  inline std::string toLower(const std::string& str) const {
    std::string newString("");
    for (std::string::const_iterator charIt = str.begin();
         charIt!=str.end();++charIt) {
          newString.push_back(std::tolower(*charIt));
        }
        return newString;
      }
};


int main(void) {
  const std::string reference[5] = {"ab","B","c1","c2","c10"};
  std::vector<std::string> referenceStrings(&(reference[0]), &(reference[5]));

  //Insert in reverse order so we know they get sorted
  std::set<std::string,LexicographicSort<std::string> > strings(referenceStrings.rbegin(), referenceStrings.rend());

  std::cout<<"Items:\n";
  std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
  std::vector<std::string> sortedStrings(strings.begin(), strings.end());
  assert(sortedStrings == referenceStrings);
}

有没有什么方法可以不写迷你解析器?

让别人做吗?

我正在使用这个实现:http://www.davekoelle.com/alphanum.html,我也修改了它以支持 wchar_t 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 字符串排序像人类一样吗? 的相关文章

随机推荐

  • init 方法中的 [self release]、[self dealloc] 或 [super dealloc] ?

    我刚刚阅读了有关如何在 init 方法中正确失败的内容 并且文档似乎彼此不同意 一种建议抛出异常 另一种则建议清理并返回 nil 目前的最佳实践是什么 我相信普遍接受的做法是失败时返回零 但你确实想释放 self 以避免泄漏 id init
  • 如何等待数据写入管道的另一端

    我正在用 C 语言开发一个应用程序 父进程和子进程通过管道进行通信 在写入管道之前 父进程执行另一个语句 在示例代码中 我使用 sleep 10 来进行延迟 在子进程中 它应该从管道读取数据 但是子进程中管道的读取端不会读取数据 int m
  • 使用 JSoup 提取图像 src

    我正在尝试使用 jsoup 从此网页中提取所有图像网址 任何人都可以提供有关如何做到这一点的帮助吗 所有标签的格式都是这样的 但我只需要 src 图像 而不是 ajaxsrc img src http image cdnllnwnl xos
  • 使用 BACK 键隐藏键盘事件

    我注意到在Android Market Application 当您单击搜索按钮时 它会显示键盘 但是当您单击back按钮 搜索EditText变得不可见并且keyboard被隐藏 问题是我无法隐藏EditText按后退键后隐藏键盘后 因为
  • Visual Studio自定义构建步骤规则?

    使用 Visual Studio 2008 当我向 C 项目添加一个不存在的文件时 c cpp h rc或者 IDE 无法识别的任何内容都会弹出一个对话框 询问我是否要为此类文件创建自定义构建步骤规则 有谁知道如何在不添加文件的情 况下进入
  • [A]如何在javafx中使MP3重复播放?

    我希望我的 mp3 文件在完成后再次重复 但我无法创建循环来重复播放我的文件 我使用了这段代码 但只有它在完成后播放我的文件的第一秒 AudioClip myMusic myMusic setCycleCount AudioClip IND
  • 代码检查 - 命名范围参考

    在 Rubberduck 2 0 11 2453 中运行代码检查后 有 4 个范围引用被标记为 成员 Range 隐式引用 ActiveSheet 有问题的范围是指命名范围 是否有必要限定命名范围引用 Private Sub RunORat
  • gcc生成目标文件时创建目录

    gcc o abc def o def c产生def o目录中的文件abc 仅当目录存在时abc 当生成的目标文件的封闭目录不存在时 有没有办法让 gcc 创建一个目录 如果没有 那么提前自动创建目录 尤其是 Makefile 的最简单方法
  • 将 rowversion 转换为 bigint

    在我的 C 程序中 我不想使用字节数组 因此我将 rowversion 数据类型转换为 bigint SELECT CAST version AS BIGINT FROM dbo mytable 所以我收到一个数字而不是字节数组 这种转换总
  • 在 sphinx 文档中包含独立的 HTML 页面

    对于我的项目的大部分文档 我更喜欢标准的 sphinx 布局 然而 对于登陆页面 我更喜欢使用自定义 HTML CSS JS 而不使用普通 sphinx 网站的任何布局 目录或侧边栏 有没有一种方法可以在 sphinx 生成的网站中包含原始
  • 自定义属性未在样式和主题内解析

    我有一个带有自定义主题的 Android 应用程序 该应用程序是 2 3 年前开发的 我有这个风格attr xml资源文件
  • 如何在同一端口 4200 上运行 Angular 4 应用程序和 NodeJS api 以进行生产和开发?

    我已经创建了 Angular 4 应用程序 我可以使用它来运行它ng serve open它运行在localhost 4200 我想要的是我还使用创建了 apinodejs现在在同一个角度项目中我想运行该 APIlocalhost 4200
  • 这个 128 位整数乘法在汇编 (x86-64) 中如何工作?

    我正在阅读计算机系统 程序员的视角作业是描述这个算法是如何工作的 C函数 void store prod int128 dest int64 t x int64 t y dest x int128 y 集会 movq rdx rax cqt
  • 如何写下 rspec 来测试救援块?

    我有这样的方法 def className def method name some code rescue some code and error message end end 那么 如何写下 rspec 来测试救援块 如果你想拯救 就
  • 从 WaitHandle.Wait 构造任务

    我选择返回Task
  • CodeIgniter - 如何检查每种方法使用的会话

    假设我的控制器名为Book 我有很多方法 比如get book read book remove book 如果没有用户登录 则无法使用类中的任何方法 我可以获得user id来自会话 我的问题是 检查是否存在的最佳方法是什么user id
  • 在 Scala 中,如何从可序列化的类型创建 TypeTag? [复制]

    这个问题在这里已经有答案了 在 Scala 反射中 通常可以使用 TypeCreator 从 Type 构造 TypeTag object TypeUtils import ScalaReflection universe def crea
  • Slim 3在中间件中获取当前路由

    我想在中间件类中获取当前 I 路由的名称 以前 在 Slim 2 中 您可以像这样获取当前路线 route this gt app gt router gt getCurrentRoute 但这个功能在Slim 3 0版本中已经被删除了 我
  • 如何尝试多个 SELECT 直到获得结果?

    如果我想以递减精度搜索表中的单行 例如像这样 SELECT FROM image WHERE name LIKE text AND group id 10 LIMIT 1 当这没有给我结果时 尝试这个 SELECT FROM image W
  • C++ 字符串排序像人类一样吗?

    我想按照人类对字母数字字符串进行排序的方式对其进行排序 即 A2 位于 A10 之前 a 当然位于 Z 之前 有没有什么方法可以不写迷你解析器 理想情况下 它还会将 A1B1 放在 A1B10 之前 我看到问题了 Microsoft SQL