Der std::find_if-Algorithmus C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion std::find_if, um nach Elementen zu suchen, die die gegebenen Kriterien erfüllen
  2. Verwenden Sie die Funktion std::find_first_of, um nach Elementübereinstimmungen in zwei Bereichen zu suchen
  3. Verwenden Sie die Funktion find_end, um die Zeichenkette mit Trennzeichen zu teilen
Der std::find_if-Algorithmus C++

Dieser Artikel zeigt, wie Sie den std::find_if-Algorithmus aus der C++ Standard Template Library verwenden.

Verwenden Sie die Funktion std::find_if, um nach Elementen zu suchen, die die gegebenen Kriterien erfüllen

Die Funktion std::find_if ist Teil von STL-Algorithmen und bietet eine Suchmethode für Elemente im Bereich, die die gegebene Bedingung erfüllen. Die Bedingung wird nämlich als aufrufbares Objekt angegeben, das einen bool-Wert zurückgibt.

Die grundlegende Überladung der Funktion std::find_if akzeptiert zwei Iteratoren, die den zu durchsuchenden Bereich angeben. Der dritte Parameter stellt das aufrufbare Objekt dar, das verwendet wird, um die Elemente im Bereich auszuwerten. Beachten Sie, dass Bereichsiteratoren mindestens die Anforderungen von LegacyInputIterator erfüllen sollten.

std::find_if gibt den Iterator zum ersten Element zurück, das die angegebenen Kriterien erfüllt, oder zum zweiten Argument-Iterator, wenn kein solches Element gefunden wird.

Im folgenden Code-Schnipsel verwenden wir den std::find_if-Algorithmus auf std::string-Objekte und verwenden die Funktion isupper als aufrufbares Objekt. Folglich sollte uns die Funktion helfen festzustellen, ob die Zeichenkette nur Kleinbuchstaben enthält oder nicht.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "this is random String";
  string str2 = "this is";
  string str3 = "wqz";

  std::find_if(begin(str1), end(str1), isupper) != end(str1)
      ? cout << "str1 contains uppercase letters" << endl
      : cout << "str1 contains only lowercase letters" << endl;

  std::find_if(begin(str2), end(str2), isupper) != end(str2)
      ? cout << "str2 contains uppercase letters" << endl
      : cout << "str2 contains only lowercase letters" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

str1 contains uppercase letters
str2 contains only lowercase letters

Verwenden Sie die Funktion std::find_first_of, um nach Elementübereinstimmungen in zwei Bereichen zu suchen

std::find_first_of ist ein weiterer leistungsstarker Algorithmus von STL, der verwendet werden kann, um nach denselben Elementen in zwei gegebenen Bereichen zu suchen. Die Funktionen akzeptieren vier Iteratoren als Parameter, von denen die ersten beiden den Bereich angeben, der nach Elementen durchsucht werden muss, die als die letzten beiden Iteratorargumente übergeben wurden.

Die letzten beiden Iteratoren müssen die Anforderungen von LegacyForwardIterator erfüllen. In diesem Fall verwenden wir den std::find_first_of-Algorithmus, um zu prüfen, ob die Zeichen in zwei Strings übereinstimmen. Der Rückgabewert der Funktion ist der Iterator zum ersten Element im gesuchten Bereich, der einem Element aus dem zweiten Bereich entspricht. Wenn kein solches Element gefunden wird, wird der zweite Iterator der durchsuchten Bereiche zurückgegeben.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "this is random String";
  string str2 = "this is";
  string str3 = "wqz";

  std::find_first_of(str1.begin(), str1.end(), str2.begin(), str2.end()) ==
          str1.end()
      ? cout << "no letters match in str1 and str2" << endl
      : cout << "some letters match in str1 and str2" << endl;

  std::find_first_of(str2.begin(), str2.end(), str3.begin(), str3.end()) ==
          str2.end()
      ? cout << "no letters match in str2 and str3" << endl
      : cout << "some letters match in str2 and str3" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

some letters match in str1 and str2
no letters match in str2 and str3

Verwenden Sie die Funktion find_end, um die Zeichenkette mit Trennzeichen zu teilen

Auf der anderen Seite haben wir den find_end-Algorithmus, um nach dem letzten Vorkommen der angegebenen Range-Sequenz in einem anderen Range zu suchen. Wie der std::find_first_of akzeptiert dieser Algorithmus vier Iteratoren, die beide Bereiche bezeichnen, aber er versucht, die genaue Sequenzübereinstimmung im ersten Bereich zu finden.

#include <iostream>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main() {
  string str1 = "this is random String";
  string str2 = "this is";
  string str3 = "wqz";

  auto ret = std::find_end(str1.begin(), str1.end(), str2.begin(), str2.end());
  ret == str1.end() ? cout << "no such sequence found" << endl
                    : cout << "last occurrence found at "
                           << std::distance(str1.begin(), ret) << endl;

  ret = std::find_end(str2.begin(), str2.end(), str3.begin(), str3.end());
  ret == str2.end() ? cout << "no such sequence found" << endl
                    : cout << "last occurrence found at "
                           << std::distance(str2.begin(), ret) << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

last occurrence found at 0
no such sequence found
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Algorithm