CodeNebula
C++23stlexpert

std::basic_string::contains / std::basic_string_view::contains (C++23 Addition)

C++23 · Completing Modern · Compiler flag: -std=c++23

Explanation

Member function that checks if a string contains a substring, character, or string view.

Real-World Scenario

Filter log lines that contain a specific error keyword.

Quick Snippet

snippet.cpp
std::string msg = "Error: file not found";
if (msg.contains("Error")) { /* handle */ }

Full Example

string_contains.cpp
// CodeNebula - C++23 Example: std::string::contains / std::string_view::contains
// Compile: g++ -std=c++23 -Wall -Wextra -o example string_contains.cpp
// Note: Requires GCC 13+ / Clang 17+

#include <iostream>
#include <string>
#include <string_view>

// C++23 adds contains() to std::string and std::string_view.
// It checks if a substring or character is present, replacing
// the verbose (str.find(x) != std::string::npos) pattern.

int main() {
    std::cout << "=== std::string::contains / std::string_view::contains ===\n\n";

    std::string text = "The quick brown fox jumps over the lazy dog";

    // contains(string_view)
    std::cout << "Text: \"" << text << "\"\n\n";
    std::cout << "contains(\"fox\"):    " << text.contains("fox") << "\n";
    std::cout << "contains(\"cat\"):    " << text.contains("cat") << "\n";
    std::cout << "contains(\"quick\"): " << text.contains("quick") << "\n\n";

    // contains(char)
    std::cout << "contains('z'): " << text.contains('z') << "\n";
    std::cout << "contains('Z'): " << text.contains('Z') << "\n\n";

    // string_view::contains
    std::string_view sv = "Hello, World!";
    std::cout << "string_view \"" << sv << "\":\n";
    std::cout << "  contains(\"World\"): " << sv.contains("World") << "\n";
    std::cout << "  contains(\"world\"): " << sv.contains("world") << "\n";
    std::cout << "  contains(','):     " << sv.contains(',') << "\n\n";

    // Practical example: filtering strings
    std::cout << "--- Filtering filenames ---\n";
    std::string files[] = {
        "main.cpp", "header.h", "readme.md",
        "config.json", "test.cpp", "build.sh"
    };

    std::cout << "C++ files: ";
    for (const auto& f : files) {
        if (f.contains(".cpp") || f.contains(".h")) {
            std::cout << f << " ";
        }
    }
    std::cout << "\n";

    // Comparison with the old approach
    std::cout << "\nOld: str.find(x) != npos  ->  New: str.contains(x)\n";
    std::cout << "Much more readable!\n";

    return 0;
}

// Expected output:
// === std::string::contains / std::string_view::contains ===
//
// Text: "The quick brown fox jumps over the lazy dog"
//
// contains("fox"):    1
// contains("cat"):    0
// contains("quick"): 1
//
// contains('z'): 1
// contains('Z'): 0
//
// string_view "Hello, World!":
//   contains("World"): 1
//   contains("world"): 0
//   contains(','):     1
//
// --- Filtering filenames ---
// C++ files: main.cpp header.h test.cpp
//
// Old: str.find(x) != npos  ->  New: str.contains(x)
// Much more readable!
Run command
g++ -std=c++23 -Wall -Wextra -o example string_contains.cpp