Advertisement
chevengur

СПРИНТ № 8 | Семантика перемещения | Урок 6: Тайные техники передачи аргументов

Jul 20th, 2024
229
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include <vector>
  2. #include <string>
  3. #include <algorithm>
  4. #include <iostream>
  5. #include <iterator>
  6.  
  7. using namespace std;
  8.  
  9. struct TestToken {
  10.     string data;
  11.     bool is_end_sentence_punctuation = false;
  12.  
  13.     bool IsEndSentencePunctuation() const {
  14.         return is_end_sentence_punctuation;
  15.     }
  16.     bool operator==(const TestToken& other) const {
  17.         return data == other.data && is_end_sentence_punctuation == other.is_end_sentence_punctuation;
  18.     }
  19.  
  20.     TestToken(const TestToken&) = default;
  21.     TestToken& operator=(const TestToken&) = delete;
  22.  
  23.     TestToken(TestToken&&) = default;
  24.     TestToken& operator=(TestToken&&) = default;
  25. };
  26.  
  27. // Перегрузка оператора << для TestToken
  28. ostream& operator<<(ostream& os, const TestToken& token) {
  29.     os << token.data;
  30.     return os;
  31. }
  32.  
  33. template <typename TokenForwardIt>
  34. TokenForwardIt FindSentenceEnd(TokenForwardIt tokens_begin, TokenForwardIt tokens_end) {
  35.     const TokenForwardIt before_sentence_end
  36.         = adjacent_find(tokens_begin, tokens_end, [](const auto& left_token, const auto& right_token) {
  37.               return left_token.IsEndSentencePunctuation() && !right_token.IsEndSentencePunctuation();
  38.           });
  39.  
  40.     if (before_sentence_end == tokens_end) {
  41.         if (tokens_begin != tokens_end && (tokens_end - 1)->IsEndSentencePunctuation()) {
  42.             return tokens_end;
  43.         }
  44.     }
  45.  
  46.     return before_sentence_end == tokens_end ? tokens_end : next(before_sentence_end);
  47. }
  48.  
  49. template <typename Token>
  50. using Sentence = vector<Token>;
  51.  
  52. template <typename Token>
  53. vector<Sentence<Token>> SplitIntoSentences(vector<Token> tokens) {
  54.     vector<Sentence<Token>> result_vector;
  55.     auto it = tokens.begin();
  56.  
  57.     while (it != tokens.end()) {
  58.         auto end_sentence = FindSentenceEnd(it, tokens.end());
  59.         Sentence<Token> push_sentence(make_move_iterator(it), make_move_iterator(end_sentence));
  60.         result_vector.push_back(move(push_sentence));
  61.         it = end_sentence;
  62.     }
  63.  
  64.     return result_vector;
  65. }
  66.  
  67. int main() {
  68.     vector<TestToken> tokens = {{"Split"s}, {"into"s}, {"sentences"s}, {"!"s, true}, {"Next"s}, {"sentence"s}, {"."s, true}};
  69.  
  70.     auto sentences = SplitIntoSentences(move(tokens));
  71.  
  72.     for (const auto& sentence : sentences) {
  73.         for (const auto& token : sentence) {
  74.             std::cout << token << " ";
  75.         }
  76.         std::cout << std::endl;
  77.     }
  78.  
  79.     return 0;
  80. }
  81.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement