|
| 1 | +/** |
| 2 | +This demonstrates different ways to find an element in a vector of strings |
| 3 | +*/ |
| 4 | +#include <iostream> |
| 5 | +#include <vector> |
| 6 | +#include <string> |
| 7 | +#include <print> |
| 8 | +#include <cassert> |
| 9 | +#include <ranges> |
| 10 | +#include <algorithm> |
| 11 | + |
| 12 | +int |
| 13 | +main() |
| 14 | +{ |
| 15 | + std::vector<std::string> vec = {"apple", "banana", "cherry", "date", "elderberry"}; |
| 16 | + std::string target = "cherry"; |
| 17 | + |
| 18 | + // Method 1: Using a loop |
| 19 | + bool found = false; |
| 20 | + for (size_t i = 0; i < vec.size(); ++i) { |
| 21 | + if (vec[i] == target) { |
| 22 | + std::print("loop: Found '{}' using loop at index {}\n", target, i); |
| 23 | + found = true; |
| 24 | + break; |
| 25 | + } |
| 26 | + } |
| 27 | + if (!found) { |
| 28 | + std::print("loop: '{}' not found using loop\n", target); |
| 29 | + } |
| 30 | + |
| 31 | + // Method 2: Using std::find_if with a lambda |
| 32 | + auto it_if = std::find_if(vec.begin(), vec.end(), [&target](const std::string& s) { return s == target; }); |
| 33 | + if (it_if != vec.end()) { |
| 34 | + std::print( |
| 35 | + "std::find_if: Found '{}' using std::find_if at index {}\n", target, std::distance(vec.begin(), it_if)); |
| 36 | + } else { |
| 37 | + std::print("std::find_if: '{}' not found using std::find_if\n", target); |
| 38 | + } |
| 39 | + |
| 40 | + // Method 3: Using std::find |
| 41 | + auto it = std::find(vec.begin(), vec.end(), target); |
| 42 | + if (it != vec.end()) { |
| 43 | + std::print("std::find: Found '{}' using std::find at index {}\n", target, std::distance(vec.begin(), it)); |
| 44 | + } else { |
| 45 | + std::print("std::find: '{}' not found using std::find\n", target); |
| 46 | + } |
| 47 | + |
| 48 | + // Method 4: std::count (pre C++20) |
| 49 | + auto count_std = std::count(vec.begin(), vec.end(), target); |
| 50 | + std::print("std::count: Vector contains '{}' {} time(s) using std::count\n", target, count_std); |
| 51 | + |
| 52 | + // Method 5: std::count_if (pre C++20) |
| 53 | + auto count_if_std = std::count_if(vec.begin(), vec.end(), [&target](const std::string& s) { return s == target; }); |
| 54 | + std::print("std::count_if: Vector contains '{}' {} time(s) using std::count_if\n", target, count_if_std); |
| 55 | + |
| 56 | + // Method 6: std::any_of |
| 57 | + bool any_of_std = std::any_of(vec.begin(), vec.end(), [&target](const std::string& s) { return s == target; }); |
| 58 | + if (any_of_std) { |
| 59 | + std::print("std::any_of: Vector contains '{}' using std::any_of\n", target); |
| 60 | + } else { |
| 61 | + std::print("std::any_of: Vector does not contain '{}' using std::any_of\n", target); |
| 62 | + } |
| 63 | + |
| 64 | + // Method 7: Using std::ranges::find (C++20) |
| 65 | + auto range_it = std::ranges::find(vec, target); |
| 66 | + if (range_it != vec.end()) { |
| 67 | + std::print( |
| 68 | + "std::ranges::find: Found '{}' using std::ranges::find at index {}\n", |
| 69 | + target, |
| 70 | + std::distance(vec.begin(), range_it)); |
| 71 | + } else { |
| 72 | + std::print("std::ranges::find: '{}' not found using std::ranges::find\n", target); |
| 73 | + } |
| 74 | + |
| 75 | + // Method 8: Using std::ranges::find_if with a lambda (C++20) |
| 76 | + auto range_it_if = std::ranges::find_if(vec, [&target](const std::string& s) { return s == target; }); |
| 77 | + if (range_it_if != vec.end()) { |
| 78 | + std::print( |
| 79 | + "std::ranges::find_if: Found '{}' using std::ranges::find_if at index {}\n", |
| 80 | + target, |
| 81 | + std::distance(vec.begin(), range_it_if)); |
| 82 | + } else { |
| 83 | + std::print("std::ranges::find_if: '{}' not found using std::ranges::find_if\n", target); |
| 84 | + } |
| 85 | + |
| 86 | + // Method 9: std::ranges::contains (C++23) |
| 87 | + auto contains = std::ranges::contains(vec, target); |
| 88 | + if (contains) { |
| 89 | + std::print("std::ranges::contains: Vector contains '{}' using std::ranges::contains\n", target); |
| 90 | + } else { |
| 91 | + std::print("std::ranges::contains: Vector does not contain '{}' using std::ranges::contains\n", target); |
| 92 | + } |
| 93 | + |
| 94 | + // Method 10: std::ranges::any_of (C++20) |
| 95 | + bool any_of = std::ranges::any_of(vec, [&target](const std::string& s) { return s == target; }); |
| 96 | + if (any_of) { |
| 97 | + std::print("std::ranges::any_of: Vector contains '{}' using std::ranges::any_of\n", target); |
| 98 | + } else { |
| 99 | + std::print("std::ranges::any_of: Vector does not contain '{}' using std::ranges::any_of\n", target); |
| 100 | + } |
| 101 | + |
| 102 | + // Method 11: std::ranges::count (C++20) |
| 103 | + auto count = std::ranges::count(vec, target); |
| 104 | + std::print("std::ranges::count: Vector contains '{}' {} time(s) using std::ranges::count\n", target, count); |
| 105 | + |
| 106 | + // Method 12: std::ranges::count_if (C++20) |
| 107 | + auto count_if = std::ranges::count_if(vec, [&target](const std::string& s) { return s == target; }); |
| 108 | + std::print( |
| 109 | + "std::ranges::count_if: Vector contains '{}' {} time(s) using std::ranges::count_if\n", target, count_if); |
| 110 | + |
| 111 | + // Method 13: via std::ranges::views (C++20) |
| 112 | + auto view = vec | std::ranges::views::filter([&target](const std::string& s) { return s == target; }); |
| 113 | + for (const auto& s : view) { |
| 114 | + std::print("std::ranges::views::filter: Found '{}' using std::ranges::views::filter\n", s); |
| 115 | + } |
| 116 | + |
| 117 | + // Assertions to verify correctness |
| 118 | + assert(it != vec.end() && *it == target); |
| 119 | + assert(found); |
| 120 | + assert(range_it != vec.end() && *range_it == target); |
| 121 | + assert(it_if != vec.end() && *it_if == target); |
| 122 | + assert(range_it_if != vec.end() && *range_it_if == target); |
| 123 | + assert(contains); |
| 124 | + assert(any_of); |
| 125 | + assert(count == 1); |
| 126 | + assert(count_std == 1); |
| 127 | + assert(count_if == 1); |
| 128 | + assert(count_if_std == 1); |
| 129 | + assert(std::ranges::distance(view) == 1); |
| 130 | + assert(any_of_std); |
| 131 | + |
| 132 | + return 0; |
| 133 | +} |
0 commit comments