IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> HJ14 字符串排序 -> 正文阅读

[C++知识库]HJ14 字符串排序

HJ14 字符串排序

#include <iostream>
#include <vector>
#include <algorithm>

static bool strlt(std::string a, std::string b) {
    int delta = 0;
    for (size_t i = 0; i <a.size() && i<b.size(); i++) {
        delta = a.at(i) - b.at(i);
        if (delta != 0) {
            return delta < 0;
        }
    }
    return a.size() < b.size();
}

int main(int argc, const char *argv[]) {
    std::vector<std::string> words;
    std::string w;
    int n = 0;
    
    std::cin >> n;
    
    while (n-- > 0) {
        std::cin >> w;
        words.push_back(w);
    } 
    std::sort(words.begin(), words.end(), strlt);
    
    for (std::vector<std::string>::const_iterator it = words.begin(); 
         it != words.end(); ++it) {
        std::cout <<*it << std::endl;
    }
}

std::sort用法?

std::sort(words.begin(), words.end(), strlt);

前个参数表示容器迭代器开始,迭代器结束,

最后1个参数传比较大小的方法

表示小于,返回bool (从小到大排序, 返回true则排前面),不是比较大小返回int 0,>0, <0

bool (*cmp)(*迭代器的类型, *迭代器类型)

对于std::vector<std::string>, 迭代器it数据类型为 std::string *, 那么*it类型就是std::string

D:\Programs\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h

 /**
   *  @brief Sort the elements of a sequence using a predicate for comparison.
   *  @ingroup sorting_algorithms
   *  @param  __first   An iterator.
   *  @param  __last    Another iterator.
   *  @param  __comp    A comparison functor.
   *  @return  Nothing.
   *
   *  Sorts the elements in the range @p [__first,__last) in ascending order,
   *  such that @p __comp(*(i+1),*i) is false for every iterator @e i in the
   *  range @p [__first,__last-1).
   *
   *  The relative ordering of equivalent elements is not preserved, use
   *  @p stable_sort() if this is needed.
  */
  template<typename _RandomAccessIterator, typename _Compare>
    inline void
    sort(_RandomAccessIterator __first, _RandomAccessIterator __last,
	 _Compare __comp)
    {
      // concept requirements
      __glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<
	    _RandomAccessIterator>)
      __glibcxx_function_requires(_BinaryPredicateConcept<_Compare,
	    typename iterator_traits<_RandomAccessIterator>::value_type,
	    typename iterator_traits<_RandomAccessIterator>::value_type>)
      __glibcxx_requires_valid_range(__first, __last);
      __glibcxx_requires_irreflexive_pred(__first, __last, __comp);

      std::__sort(__first, __last, __gnu_cxx::__ops::__iter_comp_iter(__comp));
    }

D:\Programs\mingw64\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\predefined_ops.h

  template<typename _Compare>
    _GLIBCXX14_CONSTEXPR
    inline _Iter_comp_iter<_Compare>
    __iter_comp_iter(_Compare __comp)
    { return _Iter_comp_iter<_Compare>(_GLIBCXX_MOVE(__comp)); }
  template<typename _Compare>
    struct _Iter_comp_iter
    {
      _Compare _M_comp;

      explicit _GLIBCXX14_CONSTEXPR
      _Iter_comp_iter(_Compare __comp)
	: _M_comp(_GLIBCXX_MOVE(__comp))
      { }

      template<typename _Iterator1, typename _Iterator2>
        _GLIBCXX14_CONSTEXPR
        bool
        operator()(_Iterator1 __it1, _Iterator2 __it2)
        { return bool(_M_comp(*__it1, *__it2)); }
    };

测试用例自测,改下面的代码,避免手动输入

#include <fstream>
#define DEBUG

// ...

#ifndef DEBUG
    std::cin >> n;
    while (n-- > 0) {
        std::cin >> w;
        words.push_back(w);
    }
#else
    std::ifstream ifs;
    ifs.open("../input2.txt", std::ios_base::in);
    if (!ifs.is_open()) {
        std::cout << "打开../input2.txt失败";
        return -2;
    }
    ifs >> n;
    while (n-- >0) {
        ifs >>w;
        words.push_back(w);
    }
    ifs.close();
#endif

input2.txt

54
MGDa
aha
BDTmfV
ShOBHM
QqFdcsFk
WeSj
YDyBY
RldCiGFB
h
gLmLEXW
pWOJywCx
eFcUlSfaH
krFjsPC
Vv
viYTX
bhkHwulzFC
Ya
R
EEhgyd
zM
IHp
pSDmVZ
oAeSLWTtd
bZO
F
kD
TqPZ
hI
ITwU
BMpsBRkQ
ZQhOGB
LCvYTEqHqA
flp
Bcc
VDEtYbz
uprsKe
zJYEEPiVkL
KYUwgtJfL
vVZp
AmnaxgeA
QwDXJQOxNU
thkhsKEMBr
zM
DxnWRwnfh
PDYaSCbwmR
n
kG
KfDD
tLpaLPqBaj
oXBLTJGo
pnEwvEHhic
WzMfONKYG
CiFcccEh
vfKRxZbLhq

输出:

D:\Users\mzh\CLionProjects\HJ14\cmake-build-debug\HJ14.exe
AmnaxgeA
BDTmfV
BMpsBRkQ
Bcc
CiFcccEh
DxnWRwnfh
EEhgyd
F
IHp
ITwU
KYUwgtJfL
KfDD
LCvYTEqHqA
MGDa
PDYaSCbwmR
QqFdcsFk
QwDXJQOxNU
R
RldCiGFB
ShOBHM
TqPZ
VDEtYbz
Vv
WeSj
WzMfONKYG
YDyBY
Ya
ZQhOGB
aha
bZO
bhkHwulzFC
eFcUlSfaH
flp
gLmLEXW
h
hI
kD
kG
krFjsPC
n
oAeSLWTtd
oXBLTJGo
pSDmVZ
pWOJywCx
pnEwvEHhic
tLpaLPqBaj
thkhsKEMBr
uprsKe
vVZp
vfKRxZbLhq
viYTX
zJYEEPiVkL
zM
zM

Process finished with exit code 0
?

不需要自己写排序, 直接调用系统函数std::sort

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:35:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 0:37:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码