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

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

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

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

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

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

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

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 <iostream>
#include <vector>
#include <algorithm>

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

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 <iostream>
#include <vector>
#include <algorithm>
#include <locale>

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

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;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ String