C++ 在开始/结尾处修剪字符
示例
这个例子需要头<algorithm>,<locale>和<utility>。
到修剪的序列或字符串的装置,以除去所有的前缘和后元素(或字符)匹配某谓词。我们首先修剪尾随元素,因为它不涉及移动任何元素,然后修剪前导元素。请注意,以下概括适用于所有类型的std::basic_string(例如std::string和std::wstring),并且偶然地也适用于序列容器(例如std::vector和std::list)。
template <typename Sequence, //任何basic_string,vector,list等。
typename Pred> //元素(字符)类型的谓词
Sequence& trim(Sequence& seq, Pred pred) {
return trim_start(trim_end(seq, pred), pred);
}修剪尾随元素涉及找到与谓词不匹配的最后一个元素,然后从那里擦除:
template <typename Sequence, typename Pred>
Sequence& trim_end(Sequence& seq, Pred pred) {
auto last = std::find_if_not(seq.rbegin(),
seq.rend(),
pred);
seq.erase(last.base(), seq.end());
return seq;
}修剪前导元素涉及找到与谓词不匹配的第一个元素并删除到该谓词:
template <typename Sequence, typename Pred>
Sequence& trim_start(Sequence& seq, Pred pred) {
auto first = std::find_if_not(seq.begin(),
seq.end(),
pred);
seq.erase(seq.begin(), first);
return seq;
}为了使上述内容专门用于修剪a中的空白,std::string我们可以将该函数用作谓词:std::isspace()
std::string& trim(std::string& str, const std::locale& loc = std::locale()) {
return trim(str, [&loc](const char c){ return std::isspace(c, loc); });
}
std::string& trim_start(std::string& str, const std::locale& loc = std::locale()) {
return trim_start(str, [&loc](const char c){ return std::isspace(c, loc); });
}
std::string& trim_end(std::string& str, const std::locale& loc = std::locale()) {
return trim_end(str, [&loc](const char c){ return std::isspace(c, loc); });
}同样,我们可以将函数用于etc。std::iswspace()std::wstring
如果要创建修剪后的副本的新序列,则可以使用单独的功能:
template <typename Sequence, typename Pred>
Sequence trim_copy(Sequence seq, Pred pred) { //注意:按值传递seq
trim(seq, pred);
return seq;
}