Exercise: Search a User By Lastname (std::find_if)

Description

In the previous exercise, Exercise: Search a User By Lastname, we used the original (C) search implementation, which has a number of shortcomings,

  • uses a manual loop over the C array

  • is not quite readable

Fix that, and replace the manual search code with std::find_if to do the same.

Testing requires no additional code (we did not change anything that is user-visible). The test program from the previous exercise is sufficient - if that works, our change did not break anything.

#include "userdb.h"
#include <iostream>
#include <cassert>

int main()
{
    UserDB db;

    // setup db to have something to search for
    // ----------------------------------------
    db.insert(User("Philipp", "Lichtenberger", 35));
    db.insert(User("Joerg", "Faschingbauer", 55));
    db.insert(User("Caro", "Faschingbauer", 24));

    // test the search
    // ---------------

    // we find the *first* user if it exists
    User found = db.search_by_lastname("Faschingbauer");
    assert(found.firstname() == "Joerg");
    assert(found.lastname() == "Faschingbauer");
    assert(found.age() == 55);

    // lacking knowledge of exception handling, we have to return an
    // invalid user when none exists.
    User notfound = db.search_by_lastname("DoesNotExist");
    assert(!notfound.isvalid());

    return 0;
}

Dependencies

cluster_cxx03 C++ cluster_cxx03_standard_library_miscellanea The Standard Library: Miscellaneous Topics cluster_cxx03_exercises_userdb Exercises: User Database cluster_cxx03_functions_and_methods Functions and Methods cluster_cxx03_exceptions Exceptions cluster_cxx03_templates C++ Template Basics cluster_cxx03_data_encapsulation Data Encapsulation cluster_cxx03_stl Standard Template Library cluster_c The C Programming Language cluster_c_introduction Introduction cxx03_introduction Introduction c_introduction_installation Installation cxx03_introduction->c_introduction_installation cxx03_standard_library_miscellanea_string std::string cxx03_exercises_userdb_user_const_members Exercise: const Members cxx03_exercises_userdb_user_ctor Exercise: Transform struct User Into A Class cxx03_exercises_userdb_user_const_members->cxx03_exercises_userdb_user_ctor cxx03_data_encapsulation_ctor_dtor More Constructors, Destructors cxx03_exercises_userdb_user_const_members->cxx03_data_encapsulation_ctor_dtor cxx03_exercises_userdb_userdb_insert Exercise: Insert a User into UserDB cxx03_exercises_userdb_userdb_vector_basic Exercise: Use std::vector in UserDB cxx03_exercises_userdb_userdb_insert->cxx03_exercises_userdb_userdb_vector_basic cxx03_stl_basics Standard Template Library: Basics cxx03_exercises_userdb_userdb_insert->cxx03_stl_basics cxx03_exercises_userdb_user_const Exercise: Use const cxx03_exercises_userdb_user_access_methods Exercise: Access Methods for Members cxx03_exercises_userdb_user_const->cxx03_exercises_userdb_user_access_methods cxx03_functions_and_methods_references References cxx03_exercises_userdb_user_const->cxx03_functions_and_methods_references cxx03_exercises_userdb_user_ctor->cxx03_standard_library_miscellanea_string cxx03_data_encapsulation_ctor_custom Custom Constructor cxx03_exercises_userdb_user_ctor->cxx03_data_encapsulation_ctor_custom cxx03_exercises_userdb_userdb_search_find_if Exercise: Search a User By Lastname (std::find_if) cxx03_exercises_userdb_userdb_search Exercise: Search a User By Lastname cxx03_exercises_userdb_userdb_search_find_if->cxx03_exercises_userdb_userdb_search cxx03_exercises_userdb_user_simple_method Exercise: Simple Method (Users Age By n Years) cxx03_exercises_userdb_user_access_methods->cxx03_exercises_userdb_user_simple_method cxx03_functions_and_methods_methods Methods cxx03_exercises_userdb_user_access_methods->cxx03_functions_and_methods_methods cxx03_exercises_userdb_user_default_ctor Exercise: Default Constructor (was: Arrays of Objects) cxx03_exercises_userdb_userdb_vector_basic->cxx03_exercises_userdb_user_default_ctor cxx03_exercises_userdb_userdb_vector_basic->cxx03_stl_basics cxx03_exercises_userdb_user_default_ctor->cxx03_exercises_userdb_user_const cxx03_exercises_userdb_user_default_ctor->cxx03_data_encapsulation_ctor_dtor cxx03_exercises_userdb_userdb_search->cxx03_exercises_userdb_userdb_insert cxx03_exercises_userdb_user_simple_method->cxx03_exercises_userdb_user_const_members cxx03_exercises_userdb_user_simple_method->cxx03_functions_and_methods_methods cxx03_functions_and_methods_this this cxx03_functions_and_methods_this->cxx03_functions_and_methods_methods cxx03_functions_and_methods_overloading Overloading cxx03_functions_and_methods_methods->cxx03_functions_and_methods_overloading cxx03_data_encapsulation_classes_objects Classes and Objects cxx03_functions_and_methods_overloading->cxx03_data_encapsulation_classes_objects cxx03_functions_and_methods_references->cxx03_functions_and_methods_this cxx03_exceptions_basics Basics cxx03_exceptions_try_catch try - catch cxx03_exceptions_try_catch->cxx03_exceptions_basics cxx03_exceptions_try_catch->cxx03_data_encapsulation_classes_objects cxx03_templates_class_templates Class Templates cxx03_templates_function_templates Function Templates cxx03_templates_class_templates->cxx03_templates_function_templates cxx03_templates_function_templates->cxx03_exceptions_try_catch cxx03_data_encapsulation_ctor_dtor->cxx03_data_encapsulation_ctor_custom cxx03_data_encapsulation_ctor_default Default Constructor cxx03_data_encapsulation_ctor_dtor->cxx03_data_encapsulation_ctor_default cxx03_data_encapsulation_classes_objects->cxx03_introduction cxx03_data_encapsulation_c Object Oriented Programming In Good Ol’ C cxx03_data_encapsulation_classes_objects->cxx03_data_encapsulation_c cxx03_data_encapsulation_ctor_custom->cxx03_data_encapsulation_classes_objects cxx03_data_encapsulation_ctor_default->cxx03_data_encapsulation_ctor_custom cxx03_data_encapsulation_c->cxx03_introduction cxx03_stl_basics->cxx03_templates_class_templates