在 startend 修剪字符
此示例需要标题 <algorithm>
, <locale>
和 <utility>
。
Version >= C++ 11
到修剪序列或字符串意味着以除去所有的前缘和后元素(或字符)匹配某谓词。我们首先修剪尾随元素,因为它不涉及移动任何元素,然后修剪前导元素。请注意,下面的概括适用于所有类型的 std::basic_string
(例如 std::string
和 std::wstring
),偶然也适用于序列容器(例如 std::vector
和 std::list
)。
template <typename Sequence, // any basic_string, vector, list etc.
typename Pred> // a predicate on the element (character) type
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;
}
为了专门修改以上内容来修改 tihuan 中的空白,我们可以使用 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); });
}
同样,我们可以将 std::iswspace()
函数用于 std::wstring
等。
如果你希望创建一个修剪过的副本的新序列,则可以使用单独的函数:
template <typename Sequence, typename Pred>
Sequence trim_copy(Sequence seq, Pred pred) { // NOTE: passing seq by value
trim(seq, pred);
return seq;
}