在 C++ 中對字串進行排序

Jinku Hu 2023年10月12日
  1. 在 C++ 中使用 std::sort 演算法對字串進行排序
  2. 在 C++ 中使用自定義函式包裝器對字串進行排序
在 C++ 中對字串進行排序

本指南將解釋如何在 C++ 中對字串進行排序的幾種方法。

在 C++ 中使用 std::sort 演算法對字串進行排序

在本文中,我們假設字元序列儲存在 std::string 物件中。由於 std::string 類物件是可迭代的,我們可以在其上呼叫任何基於範圍的 STL 函式。在這種情況下,我們對每個字串使用 STL 演算法中的 std::sort 函式。在這裡,我們使用 std::sort 函式的最簡單過載,它需要兩個迭代器引數來遍歷範圍並預設按非降序對元素進行排序。

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

using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << "; " << endl;
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sort(item.begin(), item.end());
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

輸出:

aabghiillmorrrsty;
ccceenorrsu;
-acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;

或者,我們可以將自定義比較器函式傳遞給 std::sort 演算法以相應地對元素進行排序。請注意,函式原型應具有以下形式:bool cmp(const Type1 &a, const Type2 &b);。在以下示例程式碼中,我們使用 lambda 表示式將排序順序反轉為降序。

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

using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << "; " << endl;
  }
  cout << endl;
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sort(item.begin(), item.end(), [](auto &c1, auto &c2) { return c1 > c2; });
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

輸出:

ytsrrromlliihgbaa ;
usrroneeccc;
ttspponnmmliiiifeeecca-;
uttroniecb;
ztsponliiiecaa;

在 C++ 中使用自定義函式包裝器對字串進行排序

前一種解決方案的一個明顯缺陷是它無法區分字元的標點和間距與有效的字母數字字元。因此,我們可以實現一個單獨的函式,從給定的 string 物件中丟棄所有標點符號和空格字元,然後呼叫 std::sort 演算法進行排序操作。刪除操作是使用 erase-remove_if 習慣用法完成的,它使用 lambda 表示式來檢查每個字元的型別。isspaceispunct 函式被使用在 <locale> 標頭檔案中。

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

using std::cin;
using std::cout;
using std::endl;
using std::sort;
using std::string;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << "; " << endl;
  }
  cout << endl;
}

void sortStringChars(string &s) {
  s.erase(std::remove_if(
              s.begin(), s.end(),
              [](auto &c) { return std::isspace(c) || std::ispunct(c); }),
          s.end());
  sort(s.begin(), s.end());
}

int main() {
  vector<string> vec1 = {"algorithms library", "occurrences",
                         "implementation-specific", "contribute",
                         "specialization"};

  for (auto &item : vec1) {
    sortStringChars(item);
  }
  printVector(vec1);

  return EXIT_SUCCESS;
}

輸出:

aabghiillmorrrsty;
ccceenorrsu;
acceeefiiiilmmnnoppstt;
bceinorttu;
aaceiiilnopstz;
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ String