如何最高效地从std::string中删除换行符?
#include <algorithm>
#include <string>
std::string str;
str.erase(std::remove(str.begin(), str.end(), '\n'), str.cend());
std::remove
的行为可能与您期望的不完全相同。
通常在调用
remove
后会调用容器的erase
方法,该方法删除未指定的值并减少容器的物理大小以匹配其新的逻辑大小。
可以在这里查看相关说明。
std::remove
参考文献中的关键句是:“通常在调用 remove
后会紧接着调用容器的 erase
方法,该方法会删除未指定的值并将容器的物理大小减小到与其新的逻辑大小相匹配。” - wcochrancend()
,例如 str.erase(std::remove(str.begin(), str.end(), '\n'), str.cend());
。 - Oğuzhan Türkif (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
如果字符串可以在任意位置包含许多换行符:
std::string::size_type i = 0;
while (i < s.length()) {
i = s.find('\n', i);
if (i == std::string:npos) {
break;
}
s.erase(i);
}
这里有一个适用于DOS或Unix的换行符:
void chomp( string &s)
{
int pos;
if((pos=s.find('\n')) != string::npos)
s.erase(pos);
}
if
改为while
循环,你就有一个相当不错的解决方案。 - CaptainBlivoid chomp(string &s){
size_t pos;
while (((pos=s.find('\n')) != string::npos))
s.erase(pos,1);
}
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
void rm_nl(string &s) {
for (int p = s.find("\n"); p != (int) string::npos; p = s.find("\n"))
s.erase(p,1);
}
使用方法:
string data = "\naaa\nbbb\nccc\nddd\n";
rm_nl(data);
cout << data; // data = aaabbbcccddd
该代码从字符串str
中删除所有换行符。
O(N)实现最好在SO上不带注释,在生产环境中带有注释。
unsigned shift=0;
for (unsigned i=0; i<length(str); ++i){
if (str[i] == '\n') {
++shift;
}else{
str[i-shift] = str[i];
}
}
str.resize(str.length() - shift);
std::string some_str = SOME_VAL;
if ( some_str.size() > 0 && some_str[some_str.length()-1] == '\n' )
some_str.resize( some_str.length()-1 );
或(删除末尾的多个换行符)
some_str.resize( some_str.find_last_not_of(L"\n")+1 );
为了扩展@Greg Hewgill's answer,适用于C++11:
如果你只需要删除字符串末尾的换行符:
在C++98中可以这样实现:
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
现在在C++11中可以这样做:
if (!s.empty() && s.back() == '\n') {
s.pop_back();
}
如果需要的话,可以将其封装在一个函数中。请注意,我在这里仅通过指针传递它,这样当您将其作为参数传递并取其地址时,它会提醒您该字符串将在函数内部被原地修改。
void remove_trailing_newline(std::string* str)
{
if (str->empty())
{
return;
}
if (str->back() == '\n')
{
str->pop_back();
}
}
// usage
std::string str = "some string\n";
remove_trailing_newline(&str);
std::string
中删除“换行符”的最有效方法?nanos()
时间戳函数进行速度测试。