Каков наиболее эффективный способ удаления "новой строки" из std::string?
С++ Удалить новую строку из многострочной строки
Ответ 1
#include <algorithm>
#include <string>
std::string str;
str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
Поведение std:: remove может не совсем быть тем, что вы ожидаете. См. Объяснение этого здесь.
Ответ 2
Вы должны использовать erase-remove idiom, ища '\n'
. Это будет работать для любого стандартного контейнера последовательности; не только string
.
Ответ 3
Если ожидается, что новая строка будет в конце строки, то:
if (!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);
}
Ответ 4
Вот для новой строки DOS или Unix:
void chomp( string &s)
{
int pos;
if((pos=s.find('\n')) != string::npos)
s.erase(pos);
}
Ответ 5
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
Ответ 6
Код удаляет все строки новой строки из строки 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);
Ответ 7
Другой способ сделать это в цикле for
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
Ответ 8
Если его где-нибудь в строке, чем вы не можете сделать лучше, чем O (n).
И единственный способ - найти '\n' в строке и удалить его.
for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);
Для больше строк новой строки, чем:
int n=0;
for(int i=0;i<s.length();i++){
if(s[i]=='\n'){
n++;//we increase the number of newlines we have found so far
}else{
s[i-n]=s[i];
}
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines
Он стирает все символы новой строки один раз.
Ответ 9
Использовать std:: алгоритмы. Этот вопрос имеет некоторые подходящие варианты повторного использования Удалить пробелы из std::string в С++
Ответ 10
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 );
Ответ 11
О ответе 3, удаляющем только последний \n вычеркнутый строковый код:
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
Будет ли условие if не работать, если строка действительно пуста?
Не лучше ли делать:
if (!s.empty())
{
if (s[s.length()-1] == '\n')
s.erase(s.length()-1);
}
Ответ 12
Все эти ответы кажутся мне немного тяжелыми.
Если вы просто выложите "\n" и переместите все остальное на место, вы можете столкнуться с некоторыми персонажами, странно выглядящими. Итак, почему бы просто не сделать простую (и самую эффективную) вещь: Заменить все '\n пробелами?
for (int i = 0; i < str.length();i++) {
if (str[i] == '\n') {
str[i] = ' ';
}
}
Могут быть способы улучшить скорость этого по краям, но это будет быстрее, чем перемещение целых кусков строки в памяти.