Maison  >  Article  >  développement back-end  >  Améliorations des objets fonctions STL en C++ 11 et C++ 14 ?

Améliorations des objets fonctions STL en C++ 11 et C++ 14 ?

王林
王林original
2024-04-25 22:06:01361parcourir

Les objets de fonction STL ont subi des améliorations majeures, notamment une sémantique de transfert et de déplacement parfaite en C++11, ainsi que l'encapsulation du pointeur de fonction et des lambdas génériques en C++14. Ces améliorations améliorent la convivialité, l'efficacité et la flexibilité ; par exemple, un lambda générique simplifie l'écriture des objets de fonction de tri en utilisant simplement std::less{} pour trier par ordre décroissant.

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

Améliorations des objets fonction STL en C++ 11 et C++ 14

Au cours de l'évolution de la bibliothèque standard C++ (STL), les objets fonction ont reçu des améliorations significatives. Ces améliorations sont conçues pour améliorer la convivialité, l’efficacité et la flexibilité.

Améliorations de C++ 11

  • Transfert parfait : Le transfert parfait permet aux objets de fonction de recevoir et de transmettre des arguments de fonction sans conversion ou copie de type explicite, améliorant ainsi l'efficacité.

Exemple de code :

struct Forwarder {
  template <typename ...Args>
  void operator()(Args&&... args) const {
    std::forward<Args>(args)...; // 完美转发参数
  }
};
  • sémantique de déplacement : la ​​sémantique de déplacement permet aux objets de fonction de déplacer leur état interne au lieu de copier, améliorant encore l'efficacité.

Exemples de code :

struct Mover {
  std::string value;

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

Améliorations en C++ 14

  • Encapsulation du pointeur de fonction : C++ 14 a introduit le type std::function, qui peut encapsuler des pointeurs de fonction, ce qui facilite l'encapsulation de fonctions. sont utilisés comme objets.

Exemple de code :

auto plus = std::function<int(int, int)>([](int a, int b) { return a + b; });
  • Lambda générique : Lambda générique vous permet de spécifier le type d'une expression lambda à l'aide de modèles, offrant sécurité et flexibilité de type.

Exemple de code :

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

Cas pratique

Supposons qu'il existe une structure de données sur les notes des étudiants et que nous souhaitons maintenant utiliser des objets de fonction STL pour trier les notes.

Code C++ 11 :

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

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

Code C++ 14 :

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

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

Comme vous pouvez le voir, le lambda générique introduit en C++ 14 simplifie l'écriture d'objets fonction triés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn