首頁  >  文章  >  後端開發  >  C++ 11 和 C++ 14 中 STL 函數物件的改進?

C++ 11 和 C++ 14 中 STL 函數物件的改進?

王林
王林原創
2024-04-25 22:06:01393瀏覽

STL 函數物件經歷了重大改進,包括 C 11 中的完美轉發和移動語義,以及 C 14 中的函數指標封裝和通用 lambda。這些改進增強了可用性、效率和靈活性,例如,通用 lambda 簡化了排序函數物件的編寫,只需使用 std::less{} 即可進行降序排序。

C++ 11 和 C++ 14 中 STL 函数对象的改进?

C 11 和C 14 中STL 函數物件的改進

在C 標準庫(STL) 的發展過程中,函數物件得到了重大改進。這些改進旨在增強可用性、效率和靈活性。

C 11 中的改進

  • #完美轉送:完美轉送允許函數物件接收和轉送函數參數,而無需明確類型轉換或複製,從而提高了效率。

程式碼範例:

struct Forwarder {
  template <typename ...Args>
  void operator()(Args&&... args) const {
    std::forward<Args>(args)...; // 完美转发参数
  }
};
  • #move 語意:move 語意允許函數物件移動其內部狀態,而不是進行複製,從而進一步提高了效率。

程式碼範例:

struct Mover {
  std::string value;

  Mover(Mover&& other) noexcept
    : value(std::move(other.value)) {
    other.value.clear(); // 移出旧值
  }
};

C 14 中的改進

  • 函數指針封裝:C 14 引入了std::function 類型,它可以封裝函數指針,這使得更輕鬆地將函數指標作為物件使用。

程式碼範例:

auto plus = std::function<int(int, int)>([](int a, int b) { return a + b; });
  • #通用lambda:通用lambda 允許使用範本指定lambda 表達式的類型,從而提供了類型安全性和靈活性。

程式碼範例:

auto sort_by = [](const auto& a, const auto& b) { return a < b; };

實戰案例

假設有一個學生成績的資料結構,現在我們要使用STL 函數物件對成績進行排序。

C 11 程式碼:

std::vector<int> grades = {90, 85, 95, 88, 92};

std::sort(grades.begin(), grades.end(),
  [](int a, int b) { return a > b; }); // 降序排序

C 14 程式碼:

std::vector<int> grades = {90, 85, 95, 88, 92};

std::ranges::sort(grades, std::less{}); // 降序排序

如你所看到的,C 14 中引入的通用lambda 簡化了排序函數物件的編寫。

以上是C++ 11 和 C++ 14 中 STL 函數物件的改進?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn