ホームページ  >  記事  >  バックエンド開発  >  C++ 11 および C++ 14 の STL 関数オブジェクトの改良点?

C++ 11 および C++ 14 の STL 関数オブジェクトの改良点?

王林
王林オリジナル
2024-04-25 22:06:01361ブラウズ

STL 関数オブジェクトは、C 11 の完全転送と移動セマンティクス、C 14 の関数ポインターのカプセル化と汎用ラムダなど、大幅な改善を受けています。これらの改善により、使いやすさ、効率性、柔軟性が向上します。たとえば、汎用ラムダでは、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; });
  • 汎用ラムダ: 汎用ラムダでは、テンプレートを使用してラムダの種類を指定できます。これにより、型の安全性と柔軟性が提供されます。

コード例:

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 の導入汎用ラムダを使用すると、ソート関数オブジェクトの作成が簡素化されます。

以上がC++ 11 および C++ 14 の STL 関数オブジェクトの改良点?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。