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

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

王林
發布: 2024-04-25 22:06:01
原創
418 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板