kutuzzzov

Спринт 4. Урок 4. Задача 3/3 Поиск в отсортированном векторе, словаре и множестве

Dec 28th, 2021 (edited)
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.73 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <utility>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. template <typename RandomIt>
  10. pair<RandomIt, RandomIt> FindStartsWith(RandomIt range_begin, RandomIt range_end, string prefix) {
  11.     // Все строки, начинающиеся с prefix, больше или равны строке "<prefix>"
  12.     auto left = lower_bound(range_begin, range_end, prefix);
  13.     // Составим строку, которая в рамках буквенных строк является точной верхней гранью
  14.     // множества строк, начинающихся с prefix
  15.     string upper_bound = prefix;
  16.     ++upper_bound[upper_bound.size() - 1];
  17.     // Первое встреченное слово, не меньшее upper_bound, обязательно является концом полуинтервала
  18.     auto right = lower_bound(range_begin, range_end, upper_bound);
  19.     return {left, right};
  20. }
  21.  
  22. int main() {
  23.     const vector<string> sorted_strings = {"moscow", "motovilikha", "murmansk"};
  24.  
  25.     const auto mo_result = FindStartsWith(begin(sorted_strings), end(sorted_strings), "mo");
  26.     for (auto it = mo_result.first; it != mo_result.second; ++it) {
  27.         cout << *it << " ";
  28.     }
  29.     cout << endl;
  30.  
  31.     const auto mt_result = FindStartsWith(begin(sorted_strings), end(sorted_strings), "mt");
  32.     cout << (mt_result.first - begin(sorted_strings)) << " " << (mt_result.second - begin(sorted_strings)) << endl;
  33.  
  34.     const auto na_result = FindStartsWith(begin(sorted_strings), end(sorted_strings), "na");
  35.     cout << (na_result.first - begin(sorted_strings)) << " " << (na_result.second - begin(sorted_strings)) << endl;
  36.  
  37.     return 0;
  38. }
Add Comment
Please, Sign In to add comment