STL庫:C++數據結構與演算法

一、STL概述

C++ STL(Standard Template Library)是C++標準庫的重要組成部分,它是一組通用的模板類和函數,實現了大量的常用數據結構和演算法,為我們提供了高效、可靠和安全的工具,簡化了程序設計和開發。STL庫中包含了以下容器:

  • 容器(Containers)
  • 迭代器(Iterators)
  • 演算法(Algorithms)
  • 函數對象(Function Objects)
  • 適配器(Adapters)

STL庫的設計理念是以泛型編程為基礎,將數據類型和演算法分開設計,使得數據結構和演算法可以獨立地發展和變換,從而實現代碼的可重用性和可擴展性。

二、容器

容器是用於存儲和管理數據的類模板,它們定義了一系列與數據操作有關的成員函數,可以快速地對數據進行插入、刪除、查找等操作。常用的STL容器有以下幾種:

1. vector

vector是一種動態數組,可以根據需要自動調整容量,實現高效的隨機訪問和插入/刪除操作。例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);
  for (int i = 0; i < v.size(); i++) {
    cout << v[i] << " ";
  }
  return 0;
}

輸出結果為:1 2 3

2. list

list是一種雙向鏈表,可以在任何位置進行插入和刪除操作,但不支持隨機訪問。例如:

#include <iostream>
#include <list>
using namespace std;
int main() {
  list<int> l;
  l.push_back(1);
  l.push_back(2);
  l.push_back(3);
  for (auto iter = l.begin(); iter != l.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 2 3

3. map

map是一種關聯容器,可以將鍵值對(Key-Value)組合存儲,支持按照鍵值進行查找和刪除等操作。例如:

#include <iostream>
#include <map>
using namespace std;
int main() {
  map<string, int> m;
  m["apple"] = 1;
  m["banana"] = 2;
  m["orange"] = 3;
  for (auto iter = m.begin(); iter != m.end(); iter++) {
    cout << iter->first << " " << iter->second << endl;
  }
  return 0;
}

輸出結果為:

apple 1
banana 2
orange 3

三、迭代器

迭代器是一種通用的數據訪問方式,可以方便地遍歷STL容器中的元素,常用的迭代器類型有以下幾種:

1. Input Iterator

Input Iterator是一個只讀的迭代器,它可以對容器中的數據進行遍歷和讀取,例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v = {1, 2, 3};
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 2 3

2. Output Iterator

Output Iterator是一個只寫的迭代器,它可以向容器中寫入數據,例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v = {1, 2, 3};
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    *iter *= 2;
  }
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:2 4 6

3. Forward Iterator

Forward Iterator是一種單向的迭代器,它支持遞增和取值操作,例如:

#include <iostream>
#include <forward_list>
using namespace std;
int main() {
  forward_list<int> flist = {1, 2, 3};
  for (auto iter = flist.begin(); iter != flist.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 2 3

4. Bidirectional Iterator

Bidirectional Iterator是一種雙向的迭代器,它可以向前和向後遍歷容器中的元素,例如:

#include <iostream>
#include <list>
using namespace std;
int main() {
  list<int> l = {1, 2, 3};
  for (auto iter = l.rbegin(); iter != l.rend(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:3 2 1

5. Random Access Iterator

Random Access Iterator是一種隨機訪問的迭代器,可以快速定位到容器中的任意位置,並進行讀寫操作,例如:

#include <iostream>
#include <vector>
using namespace std;
int main() {
  vector<int> v = {1, 2, 3};
  cout << v[1] << endl; // 輸出 2
  v[1] = 4;
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 4 3

四、演算法

演算法是STL庫中非常重要的一部分,提供了大量的常用演算法,包括查找、排序、遍歷、合併等操作。

1. 查找

STL庫中提供了多種查找演算法,包括二分查找、線性查找、查找最大/最小值等。

例如,使用二分查找演算法:(前提是數據序列已經排好序)

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
  int a[] = {1, 2, 3, 4, 5};
  cout << binary_search(a, a + 5, 4) << endl; // 輸出 1
  return 0;
}

2. 排序

STL庫中提供了多種排序演算法,包括快速排序、歸併排序、堆排序等,其中最常用的是快速排序。

例如,使用快速排序演算法:(vector會使用快排)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
  vector<int> v = {3, 1, 4, 2, 5};
  sort(v.begin(), v.end());
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 2 3 4 5

3. 遍歷

STL庫中提供了多種遍歷演算法,包括for_each、transform等,這些演算法可以對容器中的元素進行操作並輸出。

例如,使用for_each演算法將vector中的每個元素乘以2並輸出:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print(int n) {
  cout << n * 2 << " ";
}
int main() {
  vector<int> v = {1, 2, 3};
  for_each(v.begin(), v.end(), print);
  return 0;
}

輸出結果為:2 4 6

4. 合併

STL庫中提供了多種合併演算法,包括merge、set_union等,這些演算法可以將多個有序的序列合併成一個有序的序列。

例如,使用merge演算法將兩個vector合併成一個有序的序列並輸出:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
  vector<int> v1 = {1, 3, 5};
  vector<int> v2 = {2, 4, 6};
  vector<int> v3(v1.size() + v2.size());
  merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
  for (auto iter = v3.begin(); iter != v3.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 2 3 4 5 6

五、函數對象

函數對象是STL庫中的一種概念,是一種重載了運算符()的類,可以像函數一樣進行調用,可以用於演算法中的比較、計算等操作。

1. 比較函數對象

比較函數對象是一種用於比較兩個元素大小的函數對象,常用於sort、max_element等演算法中。

例如,比較函數對象的實現:

struct cmp {
  bool operator()(int a, int b) const {
    return a < b;
  }
};

使用比較函數對象對vector進行排序:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct cmp {
  bool operator()(int a, int b) const {
    return a < b;
  }
};
int main() {
  vector<int> v = {3, 1, 4, 2, 5};
  sort(v.begin(), v.end(), cmp());
  for (auto iter = v.begin(); iter != v.end(); iter++) {
    cout << *iter << " ";
  }
  return 0;
}

輸出結果為:1 2 3 4 5

2. 計算函數對象

計算函數對象是一種用於計算表達式的函數對象,常用於accumulate等演算法中。

例如,計算函數對象的實現:

struct plus_functor {
  int operator()(int a, int b) const {
    return a + b;
  }
};

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/158954.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-19 18:56
下一篇 2024-11-19 18:56

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 數據結構學生成績管理系統

    在現代教育中,學生成績的管理已經成為了一個不可或缺的部分。藉助數據結構,一個高效、可靠的學生成績管理系統可以被輕鬆實現。 一、數據結構的選擇 在構建學生成績管理系統時,選擇合適的數…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群演算法Python的介紹和實現

    本文將介紹粒子群演算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群演算法的原理 粒子群演算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29
  • Python回歸演算法算例

    本文將從以下幾個方面對Python回歸演算法算例進行詳細闡述。 一、回歸演算法簡介 回歸演算法是數據分析中的一種重要方法,主要用於預測未來或進行趨勢分析,通過對歷史數據的學習和分析,建立…

    編程 2025-04-28

發表回復

登錄後才能評論