Heim >Backend-Entwicklung >C++ >Verbesserungen an STL-Funktionsobjekten in C++ 11 und C++ 14?

Verbesserungen an STL-Funktionsobjekten in C++ 11 und C++ 14?

王林
王林Original
2024-04-25 22:06:01416Durchsuche

STL-Funktionsobjekte wurden erheblich verbessert, darunter perfekte Weiterleitungs- und Verschiebungssemantik in C++11 sowie Funktionszeigerkapselung und generische Lambdas in C++14. Diese Verbesserungen verbessern die Benutzerfreundlichkeit, Effizienz und Flexibilität; ein generisches Lambda vereinfacht beispielsweise das Schreiben von Sortierfunktionsobjekten, indem es einfach std::less{} zum absteigenden Sortieren verwendet.

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

Verbesserungen bei STL-Funktionsobjekten in C++ 11 und C++ 14

Während der Entwicklung der C++-Standardbibliothek (STL) haben Funktionsobjekte erhebliche Verbesserungen erfahren. Diese Verbesserungen sollen die Benutzerfreundlichkeit, Effizienz und Flexibilität verbessern.

Verbesserungen in C++ 11

  • Perfekte Weiterleitung: Perfekte Weiterleitung ermöglicht Funktionsobjekten das Empfangen und Weiterleiten von Funktionsargumenten ohne explizite Typkonvertierungen oder Kopien, wodurch die Effizienz verbessert wird.

Codebeispiel:

struct Forwarder {
  template <typename ...Args>
  void operator()(Args&&... args) const {
    std::forward<Args>(args)...; // 完美转发参数
  }
};
  • Move-Semantik: Move-Semantik ermöglicht es Funktionsobjekten, ihren internen Zustand zu verschieben, anstatt sie zu kopieren, was die Effizienz weiter verbessert.

Codebeispiele:

struct Mover {
  std::string value;

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

Verbesserungen in C++ 14

  • Funktionszeigerkapselung: C++ 14 führte den Typ std::function ein, der Funktionszeiger kapseln kann, was die Kapselung von Funktionen erleichtert Hinweise werden als Objekte verwendet.

Codebeispiel:

auto plus = std::function<int(int, int)>([](int a, int b) { return a + b; });
  • Generisches Lambda: Generisches Lambda ermöglicht es Ihnen, den Typ eines Lambda-Ausdrucks mithilfe von Vorlagen anzugeben, was Typsicherheit und Flexibilität bietet.

Codebeispiel:

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

Praktischer Fall

Angenommen, es gibt eine Datenstruktur für Schülernoten und wir möchten nun STL-Funktionsobjekte verwenden, um die Noten zu sortieren.

C++ 11-Code:

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

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

C++ 14-Code:

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

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

Wie Sie sehen können, vereinfacht das in C++ 14 eingeführte generische Lambda das Schreiben sortierter Funktionsobjekte.

Das obige ist der detaillierte Inhalt vonVerbesserungen an STL-Funktionsobjekten in C++ 11 und C++ 14?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn