C++11享元模式展示

2021-07-08  本文已影响0人  FredricZhu
image.png

题干,看题干好像只要能支持指定位置的单词大写就行。
但其实出题者的单元测试不只这些,
大写之后也有可能还原到小写。
这样对于每个单词,注定只能取最后一次的词频状态。
这个比较适合用map。
使用C++的std::map时需要注意,如果要把 key value值放入std::pair里面,key value值都必须有默认构造函数,就是不带参数的构造函数。
否则会翻车。
本例的WordToken没有写构造函数,那么编译器默认实现了 默认构造,拷贝构造,拷贝赋值。是有默认构造函数的。
程序代码如下,

#include <vector>
#include <map>
#include <string>
#include <sstream>
#include <algorithm>
#include <iostream>
using namespace std;

struct Sentence
{

  struct WordToken
  {
    bool capitalize{false};
  };
   
  string text_;
  
  map<size_t,WordToken> tokens_;
  
  vector<string> substrs_;

  vector<string> get_sub_strs(const string& source, const string& delim) {
    string s {source};
    vector<string> res;
    size_t pos = 0;
    std::string token;
    while ((pos = s.find(delim)) != std::string::npos) {
        token = s.substr(0, pos);
        res.push_back(token);
        s.erase(0, pos + delim.length());
    }
    res.push_back(s);
    return res;
  }
  
  Sentence(const string& text): text_{text}, substrs_ {get_sub_strs(text_, " ")}
  {
  }

  WordToken& operator[](size_t index)
  {
      tokens_[index] = {false};
      return tokens_[index];
  }

  string str() const
  {
      ostringstream oss;
      for(size_t i=0; i<substrs_.size(); ++i) {
          
        string cur = substrs_[i];
        if(tokens_.find(i) != tokens_.end()) {
            auto token = tokens_.find(i);
            if(token->second.capitalize) {
                transform(cur.begin(), cur.end(), cur.begin(), ::toupper);
            } else {
                transform(cur.begin(), cur.end(), cur.begin(), ::tolower);   
            }
        }
          oss << cur << " ";
      }
      string res = oss.str();
      res = res.substr(0, res.size() - 1);
      return res;
  }
};
上一篇 下一篇

猜你喜欢

热点阅读