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;
}
};










网友评论